Flutter调用snapshot.data的map方法报无法无条件调用错误求助
问题原因
- 你没有为
FutureBuilder指定泛型,默认状态下snapshot.data的类型是Object?,编译器无法识别它是List<AlarmInfo>类型,因此即便你加了?.运算符也无法找到map方法 - Dart空安全规则不允许直接对可能为null的对象调用方法,即便你加了
snapshot.hasData判断,没有明确类型声明的前提下,编译器依然认为snapshot.data存在null的可能,无法直接调用map map方法返回的是Iterable类型,而ListView的children要求传入List<Widget>,你缺少toList()转换也会触发后续报错
解决方案
第一步:为FutureBuilder添加泛型
明确指定FutureBuilder的泛型为List<AlarmInfo>,让编译器识别snapshot.data的类型:
FutureBuilder<List<AlarmInfo>>( future: _alarms, builder: (context, snapshot) { if(snapshot.hasData){ // 已经判断hasData的前提下,用!强制解包非空数据,调用map后加toList() return ListView( children: snapshot.data!.map<Widget>((alarm) { return Container( // 你的原有布局逻辑 ); }).toList(), ); } // 补充加载状态的返回,避免空状态报错 return const Center(child: CircularProgressIndicator()); } )
第二步:优化getAlarm方法(可选,避免重复数据)
你当前的getAlarm方法用的是全局的alarms列表,每次调用都会往列表里追加重复数据,建议修改为每次查询生成新列表返回:
Future<List<AlarmInfo>> getAlarm() async{ List<AlarmInfo> alarms = []; var db = await this.database; if(db == null) return alarms; var result = await db.query(tableName); for(var element in result){ alarms.add(AlarmInfo.fromMap(element)); } return alarms; }
内容的提问来源于stack exchange,提问作者Skrrubs
相关产品推荐
相关产品推荐

