Flutter开发遇FutureBuilder参数类型不匹配与fromJson未找到错误
报错原因及解决方案
1. 首次空类型不匹配报错
报错内容
The argument type 'List<Plants>?' can't be assigned to the parameter type 'List<Plants>'
原因
Dart空安全机制下,FutureBuilder的snapshot.data属于可空类型,异步未完成前值可能为null。即使你已经判断了snapshot.hasError为false且连接状态非等待,Dart类型系统仍无法自动推导snapshot.data为非空值,因此会出现类型不匹配的报错。
解决方案
两种方案可选,优先推荐第一种更安全的空判断写法:
- 写法1:增加空判断逻辑,避免强行非空断言可能出现的异常
// 在default分支内替换原有逻辑 if (snapshot.hasError) { return Center(child: Text('Some error')); } else { final users = snapshot.data; // 新增空判断 if (users == null) { return Center(child: Text('暂无植物数据')); } return buildPlants(users); }
- 写法2:确认数据必然返回非空的场景下,保留你现在的
users!强行非空断言写法即可。
2. fromJson方法不存在报错
报错内容
Error: Member not found: 'fromJson'
原因
你在plantData.dart中定义的Plants模型类没有实现fromJson命名构造方法,但是你在接口请求逻辑中调用了Plants.fromJson做JSON到模型对象的转换,编译器找不到对应方法就会抛出该错误。
另外还有一个隐含问题:json.decode(data)返回的是dynamic类型,你需要先强转为List才能正常执行map操作,否则后续运行可能还会出现类型转换错误。
解决方案
第一步:在plantData.dart的Plants类中实现fromJson构造方法,示例代码如下(根据你实际的Plants类属性调整字段即可):
class Plants { // 示例属性,替换为你实际的字段 final int id; final String name; final String imageUrl; final String description; Plants({ required this.id, required this.name, required this.imageUrl, required this.description, }); // 新增fromJson工厂构造方法 factory Plants.fromJson(Map<String, dynamic> json) { return Plants( id: json['id'] as int, name: json['name'] as String, imageUrl: json['image_url'] as String, description: json['description'] as String, // 其余字段对应赋值即可 ); } }
第二步:调整PlantsApi中的代码,对json.decode的返回值做强转,避免后续类型错误:
static Future<List<Plants>> getPlantsLocally(BuildContext context) async { final assetBundle = DefaultAssetBundle.of(context); final data = await assetBundle.loadString('assets/plants.json'); // 新增强转逻辑 final body = json.decode(data) as List<dynamic>; return body.map<Plants>(Plants.fromJson).toList(); }
内容的提问来源于stack exchange,提问作者Jan Kenzi Masangkay
相关产品推荐
相关产品推荐

