Flutter中对List使用await/async为何仅去掉类型声明才生效?
你第一次调用时报错的核心原因是对await关键字的返回类型理解错误:await会等待异步Future执行完成,直接返回Future包裹的实际值,而非Future对象本身,所以你给变量声明的Future<List<String>>类型和实际返回的List<String>类型不匹配,才会出现异常,和Future有没有执行完成无关。你之前去掉类型声明后能正常运行,是因为Dart的类型推断自动把_topiclist推断为List<String>类型,本质和正确的显式声明写法逻辑一致。
正确的显式类型写法分为两部分:
1. 类内部的方法和getter定义
你最初的强类型声明是完全合法的,不需要删除类型,只需要补全json解析的类型转换避免运行时报错即可:
Future<List<String>> _pntopics() async{ final _json = await http.get(Uri.parse(_topicsUrl)); if (_json.statusCode == 200) { // 补充类型转换,把jsonDecode返回的dynamic类型转为List<String> return List<String>.from(jsonDecode(_json.body)); }else { return [""]; } } Future<List<String>> get topics => _pntopics();
2. 调用侧的变量声明
因为用了await,所以变量类型应该直接声明为Future的泛型类型List<String>,而非Future本身:
List<String> _topiclist = await projectvalues.topics;
这种写法既符合Dart强类型规范、所有变量都有显式类型声明,也能稳定运行,不会出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Delmontee
相关产品推荐
相关产品推荐

