升级Flutter 2.2.2后FutureBuilder返回List时类型不匹配错误如何解决
报错原因与解决方案
报错根因
Dart 2.12及以上版本默认开启空安全机制,FutureBuilder的snapshot.data为可空类型List<dynamic>?,而ItemList组件要求传入的list参数是不可空的List<dynamic>。即便你已经通过snapshot.hasData判断数据存在,Dart的类型推导逻辑也不会自动将可空类型识别为不可空类型,因此触发类型不匹配报错。
修复方案
仅需要调整snapshot.data传参位置即可,三种常用处理方式按需选择:
- 方案1:空断言操作符强转
确认接口返回一定不会出现异常空值时,直接加!将可空类型强转为不可空类型:list: snapshot.data!, - 方案2:空值兜底
极端场景下如果出现hasData为真但数据为空的情况,用空列表兜底避免崩溃:list: snapshot.data ?? [], - 方案3:提前判空取值
写法最严谨,Dart可自动识别判空后的变量为不可空类型:builder: (context, snapshot) { if (snapshot.hasError) print(snapshot.error); final List? data = snapshot.data; if (data != null) { return ItemList(list: data); } return const Center(child: CircularProgressIndicator()); }
额外优化提示
Flutter 2.0之后已经不需要显式写new关键字创建实例,你可以直接删掉代码中所有多余的new,简化代码写法。
内容的提问来源于stack exchange,提问作者cleopatez
相关产品推荐
相关产品推荐

