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
相关产品推荐
相关产品推荐

