Flutter中Future<List<String>>强转List<String>抛出异常原因
问题根因
Future<List<String>>是Dart中对异步返回结果的封装类型,代表「未来某个时刻才会返回List<String>值」,你直接用as List<String>强转只是语法层面的类型断言,不会等待异步任务执行完成,自然不可能把Future对象直接转成它内部包裹的列表值,所以会抛出类型不匹配异常。
另外你原有代码里还有两个易触发错误的问题:
(json.decode(response) as List<dynamic>).cast<String>()是同步操作,前面不需要加await- 你定义的读取方法名是
_readJson,调用时写的readJSON名称不匹配,会直接触发找不到方法的错误
修复方案
要获取Future内部包裹的实际值,必须通过await关键字等待异步任务执行完成,且使用await的方法必须添加async标记。
第一步:修正原读取JSON方法的冗余await:
Future<List<String>> _readJson(String path) async { Directory appDocDir = await getApplicationDocumentsDirectory(); String appDocPath = appDocDir.path + '/' + path; String response = await File(appDocPath).readAsString(); // 移除cast前多余的await final data = (json.decode(response) as List<dynamic>).cast<String>(); return data; }
第二步:修改调用方法,用await获取结果:
// 方法加async标记,支持内部await调用 void _function(Map<dynamic, dynamic> playbackData) async { // ...其他逻辑 // await等待异步结果,不需要额外强转 List<String> jsonList = await _readJson('landmarks.json'); // 遍历列表,用for-in写法更简洁,原有下标遍历写法也可正常运行 for (final item in jsonList) { print(item); } }
如果你所处的场景不允许修改方法为async(例如Flutter的initState生命周期方法,要求返回值必须为void且不能标记async),可以通过then链式调用获取结果:
void _function(Map<dynamic, dynamic> playbackData) { // ...其他逻辑 _readJson('landmarks.json').then((List<String> jsonList) { for (final item in jsonList) { print(item); } }); }
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

