Flutter类型错误:List<Object?>无法转为List<String>问题排查
Dart类型不匹配错误:List<Object?> 无法转为 List
问题描述
我定义了如下列表:
List<dynamic> activityDays = [];
并编写了以下处理Firebase数据的代码:
getItems(AsyncSnapshot<QuerySnapshot> snapshot) { if (widget.user.uid.isNotEmpty) { // ignore: missing_return snapshot.data.documents.map<Column>((f) { if (f.documentID == widget.currentList.keys.elementAt(widget.i)) { f.data.forEach((a, b) { if (a == "activities") { List<dynamic> markMap = f.data['activities']; for (var element in markMap) { activityDays.add(element['days']); } } }); } }).toList();
打印activityDays得到结果:[[M, T, L], [T, T, L]],但将其传入GroupedCheckbox组件时,抛出错误:type 'List<Object?>' is not a subtype of type 'List<String>'。
错误原因与解决方案
核心问题
activityDays被定义为List<dynamic>,Dart无法推断其内部元素的具体类型;而从Firebase读取的element['days']默认是List<Object?>类型,和组件要求的List<String>不兼容。- 代码中没有对从Firebase获取的列表做类型转换,直接存入
activityDays,导致类型不匹配。
具体修复步骤
- 明确列表类型:将
activityDays的类型从dynamic改为List<List<String>>,让Dart明确知道这是存储字符串列表的列表:
List<List<String>> activityDays = [];
- 显式转换类型:在遍历
markMap时,把element['days']转换成List<String>,可以用cast<String>()方法完成安全转换:
for (var element in markMap) { // 将Object?类型的列表转为String类型列表 List<String> days = (element['days'] as List).cast<String>(); activityDays.add(days); }
- 优化冗余代码:原代码中使用
map<Column>但没有实际返回Column组件,还存在missing_return警告,建议改为forEach更符合逻辑:
getItems(AsyncSnapshot<QuerySnapshot> snapshot) { if (widget.user.uid.isNotEmpty) { snapshot.data.documents.forEach((f) { if (f.documentID == widget.currentList.keys.elementAt(widget.i)) { if (f.data.containsKey("activities")) { List<dynamic> markMap = f.data['activities']; for (var element in markMap) { List<String> days = (element['days'] as List).cast<String>(); activityDays.add(days); } } } }); } }
这样修改后,activityDays中的每个元素都是明确的List<String>类型,就能正常传入GroupedCheckbox组件了。
内容的提问来源于stack exchange,提问作者Mat Koffman
相关产品推荐
相关产品推荐

