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

Flutter:如何在ListView.builder中调用REST API并修复空检查错误?

解决Flutter中REST API数据获取的_CastError空检查错误

问题根源

你的代码中user是可空的List<User>?类型,当API请求未完成时user仍为null:

  • itemCount: user?.length会返回null,而ListView.builder会将itemCount为null视为无限列表,持续触发itemBuilder
  • 此时user![index]强制解包null,直接触发空检查错误

三种可行解决方案

1. 先处理加载状态(推荐)

在user为null时显示加载组件,避免进入ListView的渲染逻辑:

child: user == null 
    ? const Center(child: CircularProgressIndicator())
    : ListView.builder(
        itemCount: user!.length,
        itemBuilder: ((context, index) {
          return Container(
            padding: const EdgeInsets.all(16.0),
            child: Column(
              children: [Text(user![index].firstName)],
            ),
          );
        }),
      ),

2. 初始化为空列表而非可空类型

将user的定义改为非空的空列表,从根源避免null:

// 替换原来的List<User>? user;
List<User> user = [];

对应的ListView代码无需空操作符:

child: ListView.builder(
  itemCount: user.length,
  itemBuilder: ((context, index) {
    return Container(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [Text(user[index].firstName)],
      ),
    );
  }),
),

API请求完成后直接赋值user = 获取到的列表即可。

3. 空安全的条件处理(兼容场景)

如果必须保留可空类型,给itemCount设置默认值0,并在itemBuilder中做空判断:

child: ListView.builder(
  itemCount: user?.length ?? 0,
  itemBuilder: ((context, index) {
    final currentUser = user?[index];
    if (currentUser == null) return const SizedBox.shrink();
    return Container(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [Text(currentUser.firstName)],
      ),
    );
  }),
),

内容的提问来源于stack exchange,提问作者sumanth.js

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:29:20