本次分享將展開RandomWordsState以生成並顯示單詞對的列表。當用戶滾動時,ListView小部件中顯示的列表會無限增加。ListView的構建器工廠構造函數容許您根據須要懶惰地構建列表視圖。web
Tips 帶有下劃線前綴的標識符在Dart語言中會被強制進行隱私處理。添加的代碼以下app
class RandomWordsState extends State<RandomWords> { final _suggestions = <WordPair>[]; // 新加 final _biggerFont = const TextStyle(fontSize: 18.0); // 新加 @override Widget build(BuildContext context) { final wordPair = WordPair.random(); return Text(wordPair.asCamelCase); } }
下一步添加一個_buildSuggestions()方法到RandomwordsState類中,這個方法建立ListView,用來顯示建議單詞對.less
ListView類提供了一個構建器屬性itemBuilder,它是一個工廠構建器和指定爲匿名函數的回調函數。
兩個參數傳遞給函數 - BuildContext和行迭代器i。
迭代器從0開始,每次調用函數時遞增,對於每一個建議的單詞配對一次。
此模型容許建議的列表在用戶滾動時無限增加。dom
代碼以下ide
class RandomWordsState extends State<RandomWords> { final _suggestions = <WordPair>[]; final _biggerFont = const TextStyle(fontSize: 18.0); Widget _buildSuggestions() { return ListView.builder( padding: const EdgeInsets.all(16.0), itemBuilder: (context, i) { if (i.isOdd) return Divider(); final index = i ~/ 2; if (index >= _suggestions.length) { _suggestions.addAll(generateWordPairs().take(10)); } return _buildRow(_suggestions[index]); } ); } @override Widget build(BuildContext context) { final wordPair = WordPair.random(); return Text(wordPair.asCamelCase); } }
_buildSuggestions()函數每一個單詞對調用一次_buildRow()。此函數在ListTile中顯示每一個新對,能夠在下一步中使行更具吸引力。函數
完整代碼以下佈局
class RandomWordsState extends State<RandomWords> { final _suggestions = <WordPair>[]; final _biggerFont = const TextStyle(fontSize: 18.0); Widget _buildSuggestions() { return ListView.builder( padding: const EdgeInsets.all(16.0), itemBuilder: (context, i) { if (i.isOdd) return Divider(); final index = i ~/ 2; if (index >= _suggestions.length) { _suggestions.addAll(generateWordPairs().take(10)); } return _buildRow(_suggestions[index]); } ); } Widget _buildRow(WordPair wordPair) { return ListTile( title: Text( wordPair.asPascalCase, style: _biggerFont, ), ); } @override Widget build(BuildContext context) { final wordPair = WordPair.random(); return Text(wordPair.asCamelCase); } }
完整代碼以下:字體
class RandomWordsState extends State<RandomWords> { final _suggestions = <WordPair>[]; final _biggerFont = const TextStyle(fontSize: 18.0); Widget _buildSuggestions() { return ListView.builder( padding: const EdgeInsets.all(16.0), itemBuilder: (context, i) { if (i.isOdd) return Divider(); final index = i ~/ 2; if (index >= _suggestions.length) { _suggestions.addAll(generateWordPairs().take(10)); } return _buildRow(_suggestions[index]); } ); } Widget _buildRow(WordPair wordPair) { return ListTile( title: Text( wordPair.asPascalCase, style: _biggerFont, ), ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('啓動一個生成器') ), body: _buildSuggestions(), ); } }
使用下面突出顯示的構建方法替換原始方法:ui
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: '啓動一個生成器 - Gowhich', home: RandomWords(), ); } }
不管你滾動多遠,你都應該看到一個單詞配對列表。以下圖
spa