Flutter/Dart访问snapshot.data时Object类型未定义运算符[]报错如何解决
报错成因
- 你使用的
FutureBuilder/StreamBuilder未指定snapshot.data的泛型类型,Dart会默认将snapshot.data推导为Object类型,而Object本身没有定义[]下标访问运算符,因此调用snapshot.data![0][0]、snapshot.data![1]时会直接触发静态类型检查报错。 - 即便实际异步返回的是列表结构,只要没有提前做类型声明或显式转换,Dart的类型校验规则不会默认允许直接对
Object类型使用下标访问。
修复方案
按以下两个步骤修改即可:
- 首先给异步组件明确泛型,比如你返回的是嵌套列表结构,就将
FutureBuilder声明为FutureBuilder<List<dynamic>>,如果能确定更精准的返回类型(比如内层是Map结构的嵌套列表),可以写为FutureBuilder<List<List<Map<String, dynamic>>>>,泛型要和你实际异步返回的结构匹配。 - 访问数据前增加类型校验和显式转换,避免运行时异常,修改后的参考代码如下:
// 先校验数据结构合法再访问 if (snapshot.data is List && (snapshot.data as List).length >= 2) { // 显式转换为List类型后再做后续操作 List dataList = snapshot.data as List; TotalResponse totalResponse = TotalResponse.fromJson(dataList[0][0]); String confirmed = totalResponse.confirmed; String recovered = totalResponse.recovered; String deaths = totalResponse.deaths; String active = (int.parse(confirmed) - int.parse(recovered) - int.parse(deaths)) .toString(); print(dataList[1]); List<int> list = dataList[1].toString().codeUnits; }
如果不需要做兼容校验,也可以在拿到数据时直接做类型转换后赋值,后续直接用转换后的变量访问下标即可:List data = snapshot.data as List;
内容的提问来源于stack exchange,提问作者AliceYusuf
相关产品推荐
相关产品推荐

