You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:24:04