You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用Dio获取响应后无法转为实体对象求助

问题修复方案

一、核心问题排查

你的代码里有3个关键错误导致数据无法转换:

  1. Dio请求结果未赋值:WisataApi里的result变量始终为null,因为你没把Dio请求的返回值赋值给它
  2. 类型不匹配+属性调用错误:HomeViewModel里定义的_wisata是List<ListWisata>,但接口返回的是List<Datawisata>,而且你错误调用了c!.datawisata(c本身就是列表,根本没有这个属性)
  3. 实体类转换方法需确保正确实现: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();
    }
  }
}

三、验证要点

  1. 确保JSON响应里的字段名称、大小写和Datawisata类的字段完全匹配
  2. 如果JSON包含嵌套数组(比如imgs),要在Datawisata.fromJson里补充对应转换逻辑
  3. 测试时可以在WisataApi里打印result.data['datawisata'],确认拿到的是合法的列表数据

内容的提问来源于stack exchange,提问作者StarsHat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:10:43