Flutter使用Sqflite时FutureBuilder调用snapshot.data.length报错
问题原因
- 根本原因是强类型语言Dart的类型检查触发报错:你没有给
FutureBuilder指定泛型,导致snapshot.data被默认推断为Object?类型,Object类型本身没有length属性,哪怕你打印看到运行时实际是数组,类型检查也会直接抛出错误。 - 额外诱因:你的所有异步查询方法都没有声明明确的返回类型,全部隐式返回
dynamic,导致Dart类型推断失效,进一步放大了类型问题。
解决步骤
- 首先给所有数据库相关方法补全明确的返回类型
// DataBaseHelper中的查询方法补全返回类型 Future<List<Map<String, dynamic>>> getMatchs() async { final _db = await db; var result = await _db!.query('mathcTable'); return result; } // GetX控制器中的方法同步补全返回类型 Future<List<Map<String, dynamic>>> get matchs => getMatchs(); Future<List<Map<String, dynamic>>> getMatchs() async { var list = await DataBaseHelper.instance.getMatchs(); return list; }
- 给
FutureBuilder指定和返回值匹配的泛型,优化类型判断逻辑
body: FutureBuilder<List<Map<String, dynamic>>>( future: _game.matchs, builder: (context, snapshot) { // 优先判断加载错误,方便后续排查问题 if (snapshot.hasError) { return Text('加载失败:${snapshot.error}'); } if (snapshot.hasData) { // 此时snapshot.data已经是明确的非空List类型,可直接调用length var list = snapshot.data!; return ListView.builder( itemCount: list.length, itemBuilder: (context, index) { // 后续可直接通过list[index]['字段名']读取数据 return Text('比赛ID:${list[index]['id']}'); }); } else { return const Text('waiting data'); } })
内容的提问来源于stack exchange,提问作者Sermed mayi
相关产品推荐
相关产品推荐

