Flutter使用Future.wait时snapshot.data元素返回null如何解决?
Flutter 中 Future.wait 返回 null 问题解决方案
- 你定义的两个异步方法没有显式返回接口请求的结果,Dart 中
async修饰的方法如果没有写return语句,默认会返回Future<null>,这是你拿到 null 值的根本原因。
原错误的异步方法代码:
Future<AdBanner?> futureAdd() async { _adService.getAds('2'); } Future<Categories?> futureCatergoriess() async { _adService.getAllCategories(); }
第一步:修复异步方法的返回值
给两个异步方法加上 return,将接口请求的 Future 结果返回:
Future<AdBanner?> futureAdd() async { return _adService.getAds('2'); } Future<Categories?> futureCatergoriess() async { return _adService.getAllCategories(); }
第二步:修复 FutureBuilder 内的取值逻辑
你后续修改的代码直接把 Future.wait 返回的整个列表传给了 ListView,所以才会渲染出 2 个 index 文本:Future.wait 返回的列表长度和你传入的 Future 数量一致,你传入了2个Future,所以列表长度为2。
正确的取值逻辑要按你传入 Future 的顺序拿对应结果,同时要做空安全判断,避免空异常:
@override Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, backgroundColor: Colors.grey[200], body: FutureBuilder( future: Future.wait([futureCatergoriess(), futureAdd()]), builder: (context, AsyncSnapshot<List<dynamic>> snapshot) { if (snapshot.hasData) { // 索引0对应你传入的第一个Future的结果:分类数据 final Categories? categories = snapshot.data![0]; // 索引1对应你传入的第二个Future的结果:广告数据 final AdBanner? adBanner = snapshot.data![1]; // 分类数据为空时展示错误页 if (categories == null) { return const NewsError(errorMessage: '未获取到分类数据'); } return ListView.builder( itemCount: categories.length, itemBuilder: (BuildContext context, int index) { // 替换为你实际的业务渲染逻辑 return const Text('index'); } ); } else if (snapshot.hasError) { return NewsError( errorMessage: snapshot.error.toString(), ); } else { return const NewsLoading( text: 'Loading...', ); } }, ), ); }
原报错说明
你收到的报错 The getter 'length' was called on null. Receiver: null Tried calling: length 翻译为:在空对象上调用了 length 属性,触发原因就是未加 return 的异步方法返回了 null,你直接对 null 调用 .length 就触发了这个异常。
内容的提问来源于stack exchange,提问作者gegentierversuche
相关产品推荐
相关产品推荐

