本次分享将展开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