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

Flutter普通类读取本地JSON报错Future不是String子类型如何解决

报错根本原因

  • 你定义的response是Future<String>类型,不是解析后的JSON数组对象,直接用response[0]相当于对Future对象取下标,自然会报类型不匹配错误
  • 你只拿到了JSON的字符串内容,没有用dart:convert把字符串反序列化为List/Map结构
  • 异步操作没有用await等待完成,代码执行到取下标逻辑的时候,JSON还没加载完成

解决步骤

1. 引入依赖包

首先在文件头部引入JSON解析需要的dart:convert:

import 'dart:convert';
import 'package:flutter/services.dart';

同时确认pubspec.yaml中已经正确配置了assets资源路径,否则会报资源找不到错误:

flutter:
  assets:
    - assets/file/Data.json

2. 改造异步方法

因为加载本地资源是异步操作,所有要用到JSON数据的方法都需要改为异步方法,用await等待资源加载完成后再做解析:

class Logic {
  // 同步计算方法不需要改造
  int vehicleAge(DateTime doPurchase, DateTime doRenewel) {
    var vAge = doPurchase.difference(doRenewel).abs().inDays;
    return vAge;
  }

  // 涉及JSON读取的方法改为异步,返回Future对象
  Future<List<dynamic>?> belowFiveYear(int age, int fiveyear, int getInt, String zone,
      String odBasicRate, int basicTP) async {
    // 等待JSON字符串加载完成
    String jsonStr = await rootBundle.loadString('assets/file/Data.json');
    // 把JSON字符串解析为数组结构
    List<dynamic> jsonData = jsonDecode(jsonStr);
    
    print(jsonData); // 可自行打印确认解析结果

    if (age <= fiveyear && getInt == 76150 && zone == 'Zone A') {
      odBasicRate = jsonData[0]['Zone A'];
      basicTP = 752;
      return [odBasicRate, basicTP];
    }
    // 其余业务分支自行补充对应返回值
    return null;
  }
}

3. 调用方法时适配异步逻辑

在业务层调用该方法时,需要配合async/await或者FutureBuilder使用:

// 示例调用代码
void fetchOdRate() async {
  Logic logic = Logic();
  List? result = await logic.belowFiveYear(3, 5, 76150, 'Zone A', '', 0);
  print(result);
}

优化建议(可选)

如果Logic类会频繁调用JSON相关方法,可以做缓存避免每次调用都重复读取本地文件:

class Logic {
  List? _cachedJsonData;
  
  // 封装带缓存的JSON加载方法
  Future<List> _loadJsonData() async {
    if (_cachedJsonData != null) return _cachedJsonData!;
    String jsonStr = await rootBundle.loadString('assets/file/Data.json');
    _cachedJsonData = jsonDecode(jsonStr);
    return _cachedJsonData!;
  }

  int vehicleAge(DateTime doPurchase, DateTime doRenewel) {
    return doPurchase.difference(doRenewel).abs().inDays;
  }

  Future<List<dynamic>?> belowFiveYear(int age, int fiveyear, int getInt, String zone,
      String odBasicRate, int basicTP) async {
    List jsonData = await _loadJsonData();
    if (age <= fiveyear && getInt == 76150 && zone == 'Zone A') {
      odBasicRate = jsonData[0]['Zone A'];
      basicTP = 752;
      return [odBasicRate, basicTP];
    }
    return null;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:36:02