Flutter中使用Dio获取响应后无法转为实体对象求助
问题修复方案
一、核心问题排查
你的代码里有3个关键错误导致数据无法转换:
- Dio请求结果未赋值:
WisataApi里的result变量始终为null,因为你没把Dio请求的返回值赋值给它 - 类型不匹配+属性调用错误:
HomeViewModel里定义的_wisata是List<ListWisata>,但接口返回的是List<Datawisata>,而且你错误调用了c!.datawisata(c本身就是列表,根本没有这个属性) - 实体类转换方法需确保正确实现:
wisataFromSnapshot方法必须正确遍历快照并转换每个元素
二、修复后的完整代码
1. 修复WisataApi
class WisataApi { static Future<List<Datawisata>?> getWisata() async { try { // 关键:把Dio请求结果赋值给result final result = await Dio().get('https://windramayu-api-default-rtdb.asia-southeast1.firebasedatabase.app/'); return Datawisata.wisataFromSnapshot(result.data['datawisata']); } on DioError catch (e) { throw Exception(e.toString()); } return []; } }
2. 修复Datawisata实体类(确保转换逻辑正确)
class Datawisata { String? about; String? alamat; // 补充你的其他字段 Datawisata({this.about, this.alamat, /* 其他字段参数 */}); factory Datawisata.fromJson(Map<String, dynamic> json) { return Datawisata( about: json['about'], alamat: json['alamat'], // 其他字段对应赋值,比如嵌套的Imgs数组: // imgs: json['imgs'] != null ? List<Imgs>.from(json['imgs'].map((x) => Imgs.fromJson(x))) : null, ); } static List<Datawisata> wisataFromSnapshot(List snapshot) { // 遍历快照,将每个JSON对象转为Datawisata实例 return snapshot.map((jsonItem) => Datawisata.fromJson(jsonItem)).toList(); } } class Imgs { final String img; Imgs({required this.img}); factory Imgs.fromJson(Map<String, dynamic> json) { return Imgs(img: json['img']); } }
3. 修复HomeViewModel(统一类型匹配)
class HomeViewModel extends ChangeNotifier { // 改为和接口返回一致的List<Datawisata>类型 List<Datawisata> _wisata = []; List<Datawisata> get wisatalist => _wisata; Future<void> getWisatas() async { final c = await WisataApi.getWisata(); // 空安全处理后直接赋值 if (c != null) { _wisata = c; notifyListeners(); } } }
三、验证要点
- 确保JSON响应里的字段名称、大小写和
Datawisata类的字段完全匹配 - 如果JSON包含嵌套数组(比如
imgs),要在Datawisata.fromJson里补充对应转换逻辑 - 测试时可以在
WisataApi里打印result.data['datawisata'],确认拿到的是合法的列表数据
内容的提问来源于stack exchange,提问作者StarsHat
相关产品推荐
相关产品推荐

