上一篇文章咱們初體驗了Flutter,瞭解瞭如何建立項目與熱加載。本文咱們經過完成一個列表的例子來進一步感覺Flutter的使用效果。經過閱讀本文你講了解以下內容:git
示例效果以下github
打開Android Studio,File->New->New Flutter Project… 選擇 Flutter Application, 輸入項目名稱、位置、描述等信息,選擇Next,輸入公司信息,點擊FInish完成。項目打開後咱們主要用以下圖的功能:shell
列表項目咱們須要使用第三庫來實現,Flutter的第三方庫依賴放在pubspec.yaml
文件中。 打開此文件,鍵入以下內容:app
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
english_words: ^3.1.0
dev_dependencies:
複製代碼
cupertino_icons
是一個字體圖標庫,english_words
是一個生成英文單詞的庫。框架
以後再命令行中執行以下命令less
~/my/flutter/flutter_frist $ flutter packages get
複製代碼
你可能會遇到內容下載不下來的問題,這是牆的緣由,經過修改國內鏡像能夠解決,dom
~/my/flutter/flutter_frist $ export PUB_HOSTED_URL=https://pub.flutter-io.cn
~/my/flutter/flutter_frist $ export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
複製代碼
再次執行 flutter packages get
便可獲取依賴。ide
準備好了上面內容,咱們就能夠去寫代碼完成今天的任務了。打開 main.dart
,清空裏面的代碼。輸入以下代碼:字體
import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart'; //引入第三方庫頭文件
void main() => runApp(MyApp()); //項目入口
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) { //啓動項目會自動執行build方法。
return MaterialApp(
title: "Startup Name Generator",
home: RandomWord()
);
}
}
複製代碼
這段代碼中咱們引入了第三方文件,建立項目入口。ui
StatelessWidget 繼承自 Widget。Widget是Flutter框架中的核心組件,StatelessWidget表示的是一個不可變的Widget。
固然上面代碼還不能執行,咱們須要實現RandomWord
。
class RandomWordsStatus extends State<RandomWord> {
Widget _buildRow(WordPair pair) {
@override
Widget build(BuildContext context) {
return Scaffold (
appBar: AppBar( //導航欄
title: Text('Startup Name Generator'), //標題
actions: <Widget>[ //按鈕
IconButton(icon: Icon(Icons.list), onPressed: _pushSaved ,)
],
),
// body: _buildSuggestions(),
);
}
}
}
class RandomWord extends StatefulWidget {
@override
RandomWordsStatus createState() => RandomWordsStatus();
}
複製代碼
此時運行項目,你可獲得一個帶有導航條的空白頁。
接下來咱們完成列表
Widget _buildSuggestions() {
_suggestions.clear();
_suggestions.addAll(generateWordPairs().take(20)); // 數據源 隨機生成20個單詞
return ListView.builder(
padding: const EdgeInsets.all(16.0),
itemCount: _suggestions.length,
itemBuilder: (context, i) {
if (i.isOdd) return Divider(); //顯示分割線
return _buildRow(_suggestions[i]); //顯示文檔
});
}
//渲染cell
Widget _buildRow(WordPair pair) {
final bool alreadySaved = _saved.contains(pair);
return ListTile (
title: Text(pair.asPascalCase,
style: _biggerFont,
),
trailing: Icon(
alreadySaved ? Icons.favorite : Icons.favorite_border,
color: alreadySaved ? Colors
.red : null,
),
onTap: () { //點擊事件
setState( //此方法自動刷新界面。
(){
if(alreadySaved) {
_saved.remove(pair);
} else {
_saved.add(pair);
}
}
);
},
);
複製代碼
到這一步咱們就能看到一個列表了。
下面咱們實現點擊事件。
void _pushSaved() {
Navigator.of(context).push( //push下一個頁面
MaterialPageRoute<void>(
builder: (BuildContext context) {
//
final Iterable<ListTile> tiles = _saved.map(
(WordPair pair) {
return ListTile(
title: Text(
pair.asPascalCase,
style: _biggerFont,
),
);
}
);
final List<Widget> divided = ListTile
.divideTiles(
context: context,
tiles: tiles
).toList();
return Scaffold(
appBar: AppBar(title: Text('saved Suggestions'),),
body: ListView(children:
divided,),
);
}
)
);
}
複製代碼
OK,到此咱們的列表頁面寫完了,不知道你的程序有沒有跑起來,你能夠參照個人源代碼來完善你的代碼。
本文參考資料Flutter官方Demo,體驗了Flutter的開發流程,我的以爲Flutter的開發體驗要比React Native高效的多。固然本文中還有不少咱們不明白的地方,在以後的文章中都會一一講解。若是你對Flutter有興趣能夠關注個人公衆號。