Flutter运行报错:无法无条件调用'[]'方法因接收者可能为null如何解决
问题原因
这个报错是Dart空安全机制导致的,核心有3个问题:
FutureBuilder未指定泛型,snapshot.data默认类型为Object?,Dart既无法保证它非空,也无法识别它支持[]下标访问操作getData方法未明确指定返回值类型,Dart无法推断返回的JSON数据结构- 原代码的
FutureBuilder漏传了future参数,ListView.builder也漏传了itemCount参数,会额外触发加载异常、下标越界问题
你看的旧教程是Flutter没有强制空安全的旧版本,所以相同代码当时可以正常运行,现在新版本Flutter默认开启空安全校验,就会触发报错。
解决方案
按照以下步骤修改代码即可:
- 修改
getData方法,明确返回值类型,补全请求失败的返回逻辑:
// 修改方法声明,指定返回类型 Future<List<Map<String,dynamic>>> getData() async { http.Response response = await http .get(Uri.parse("https://jsonplaceholder.typicode.com/posts/")); if (response.statusCode == HttpStatus.ok) { var result = jsonDecode(response.body); // 强转返回数据类型 return result as List<Map<String,dynamic>>; } // 补全请求失败时的返回,避免Future返回null return []; }
- 修改
FutureBuilder相关逻辑,补全参数和类型声明:
body: FutureBuilder<List<Map<String,dynamic>>>( // 补充缺失的future参数,绑定getData方法 future: getData(), builder: (context, snapshot) { if (snapshot.hasData) { // 已经判断过hasData,可直接用!强制非空 var myData = snapshot.data!; return ListView.builder( // 补充itemCount避免下标越界 itemCount: myData.length, itemBuilder: (context, index) => ListTile( title: Text(myData[index]['body']), ), ); } else { return const Center( child: CircularProgressIndicator( color: Colors.black, ), ); } }, )
额外提示
如果你是开发移动端/桌面端应用,可以删掉import 'dart:html';,这个库仅支持web平台,否则打包非web应用会触发编译错误。
内容的提问来源于stack exchange,提问作者Rudransh Singh Mahra
相关产品推荐
相关产品推荐

