Flutter开发报NoSuchMethodError: method 'take' call of null错误求助
错误原因
你遇到的NoSuchMethodError: method 'take' call of null报错,核心原因是你自定义的generateWordPairs()方法是空实现,没有返回任何值,默认返回null,后续调用null.take(10)自然触发空指针调用异常。同时你的代码还有多处逻辑和依赖问题需要同步修复:
- 多余导入了仅web端可用的
dart:html依赖,非web项目运行会报错 - 自定义的
WordPair类是空实现,核心属性方法都没有返回有效值 _buildRow方法中直接写死了字符串'pair.asPascalCase',没有读取变量实际值
修复步骤
步骤1:添加官方单词生成依赖
打开项目根目录的pubspec.yaml,在dependencies节点下新增依赖:
dependencies: flutter: sdk: flutter # 新增这行 english_words: ^4.0.0
执行flutter pub get安装依赖。
步骤2:修改main.dart文件
删除首行多余的import 'dart:html';即可,其余代码无需改动。
步骤3:重写random_words.dart文件
完整修改后的代码如下:
import 'package:flutter/material.dart'; import 'package:english_words/english_words.dart'; class RandomWords extends StatefulWidget { @override RandomWordsState createState() => RandomWordsState(); } class RandomWordsState extends State<RandomWords>{ final _randomWordPairs = <WordPair>[]; final _savedWordPairs = <WordPair>[]; Widget _buildList () { return ListView.builder( padding: const EdgeInsets.all(16), itemBuilder: (context,item){ if(item.isOdd) return Divider(); final index = item ~/ 2; if(index>=_randomWordPairs.length){ _randomWordPairs.addAll(generateWordPairs().take(10)); } return _buildRow(_randomWordPairs[index]); } ); } Widget _buildRow(WordPair pair){ final alreadySaved = _savedWordPairs.contains(pair); return ListTile( title: Text(pair.asPascalCase, style: TextStyle(fontSize: 18.0),), trailing: Icon( alreadySaved ? Icons.favorite : Icons.favorite_border, color: alreadySaved ? Colors.red : null ), onTap: (){ setState(() { if(alreadySaved){ _savedWordPairs.remove(pair); }else{ _savedWordPairs.add(pair); } }); }, ); } void _pushSaved() { Navigator.of(context).push( MaterialPageRoute(builder:(BuildContext context){ final Iterable<ListTile> tiles = _savedWordPairs.map((WordPair pair){ return ListTile( title: Text(pair.asPascalCase, style: TextStyle(fontSize: 16.0),), ); }); final List<Widget> divided = ListTile.divideTiles( context: context, tiles: tiles ).toList(); return Scaffold( appBar: AppBar(title: Text('Saved WordPairs')), body: ListView(children: divided) ); }) ); } Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('WordPair Generator'), actions: <Widget>[ IconButton( icon: Icon(Icons.list), onPressed: _pushSaved ) ], ), body: _buildList() ); } }
修改后重新运行项目即可正常实现单词对生成、收藏/取消收藏、收藏列表查看功能。
内容的提问来源于stack exchange,提问作者NJ9
相关产品推荐
相关产品推荐

