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

Dart/Flutter解析JSON时List<dynamic>与List<String>类型不匹配错误

问题排查与修复方案

第一个错误:Field '_survey@xxxx'未初始化

原因

getParsedData是同步方法,但内部调用的_getData是异步加载JSON的方法——调用_getData后代码会直接跳到return _survey,这时候异步加载还没完成,_survey根本没被赋值,而late修饰的变量必须在使用前初始化,所以触发了这个错误。

修复

把getParsedData改成异步方法,同时调整调用逻辑,确保数据加载完成后再跳转页面:

  • 把SurveyUtilities里的_survey改成可空类型,避免late带来的初始化问题
  • getParsedData返回Future<SurveyData>,内部等待_getData完成后再返回数据
  • 调用时用await等待数据加载完成

第二个错误:type 'List' is not a subtype of type 'List'

原因

JSON解析出来的数组默认是List<dynamic>类型,直接赋值给List<String>类型的questions,Dart不会自动做类型转换,所以报类型不匹配的错误。

修复

在SurveyData.fromJson构造函数里,把json['questions']强制转换为List<String>,可以用cast<String>()方法快速转换。


修正后的完整代码

SurveyData类

class SurveyData {
  String title = "";
  String description = "";
  List<String> questions = [];

  SurveyData({required this.title, required this.description, required this.questions});

  SurveyData.fromJson(Map<String, dynamic> json)
      : title = json['title'] ?? "", // 增加空值兜底,避免JSON字段缺失报错
        description = json['description'] ?? "",
        questions = (json['questions'] as List).cast<String>(); // 转换为List<String>
}

SurveyUtilities类

class SurveyUtilities {
  SurveyData? _survey; // 改为可空类型,避免late初始化问题

  /// 从本地资源加载并解析问卷数据
  Future<void> _getData(String location) async {
    var json = await rootBundle.loadString(location);
    Map<String, dynamic> parsed = jsonDecode(json);
    _survey = SurveyData.fromJson(parsed);
  }

  /// 获取解析后的问卷数据(异步方法)
  Future<SurveyData> getParsedData(String location) async {
    // 缓存逻辑:如果已经加载过,直接返回,避免重复加载
    if (_survey == null) {
      await _getData(location);
    }
    return _survey!;
  }
}

调用代码

GestureDetector(
  child: const Text(
    "参与问卷调查",
    style: TextStyle(
      fontSize: 16.0,
      color: Colors.blueGrey,
      decoration: TextDecoration.underline,
    ),
  ),
  onTap: () async {
    // 等待数据加载完成
    final surveyData = await sUtil.getParsedData(survey.location);
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => SurveyPage(data: surveyData),
      ),
    );
  },
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:22:10