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

Flutter API响应正常但FutureBuilder的snapshot无数据持续加载问题

问题根因及修复方案

你代码里存在两处核心逻辑错误,导致FutureBuilder始终无法拿到有效数据:


1. 接口请求方法返回类型不匹配

你在api_services.dart的fetchUsersData方法声明返回Future<UsersData>,但实际返回的是result['results'],这只是接口返回的用户列表数组,不是完整的UsersData实体对象,类型不匹配会抛出异常,所以snapshot.hasData始终为false,加载圈一直转动。
修复后fetchUsersData代码:

Future<UsersData> fetchUsersData() async {
  final request = api + userCount.toString();
  final response = await http.get(Uri.parse(request));

  if (response.statusCode == 200) {
    // 直接调用你已定义好的解析方法,解析完整响应体
    return usersDataFromJson(response.body);
  } else {
    throw Exception('Failed to load UsersData');
  }
}

2. FutureBuilder数据访问逻辑错误

你定义的UsersData实体外层包裹了results和info两个字段,不能直接对snapshot.data取长度、用Map下标['xxx']访问属性,需要先取results字段,再通过实体类属性调用取值,同时补充错误状态判断,方便定位问题。
修复后FutureBuilder代码:

FutureBuilder<UsersData>(
  future: fetchUsersData(),
  builder: (context, AsyncSnapshot<UsersData> snapshot) {
    // 优先判断错误状态
    if (snapshot.hasError) {
      return Center(child: Text("加载失败:${snapshot.error}"));
    }
    if (snapshot.hasData) {
      final userList = snapshot.data?.results ?? [];
      return ListView.builder(
        padding: const EdgeInsets.all(8),
        itemCount: userList.length,
        itemBuilder: (BuildContext context, int index) {
          final user = userList[index];
          return Card(
            child: Column(
              children: [
                ListTile(
                  leading: CircleAvatar(
                    radius: 30.0,
                    backgroundImage: NetworkImage(user.picture?.large ?? ""),
                  ),
                  title: Text(user.name?.first ?? ""),
                  subtitle: Text(user.location?.city ?? ""),
                  trailing: Text(user.dob?.age.toString() ?? ""),
                ),
              ],
            ),
          );
        },
      );
    } else {
      return const Center(child: CircularProgressIndicator());
    }
  }
)

额外注意事项

需要给项目配置网络权限,否则请求会被系统拦截:

  • Android端:在android/app/src/main/AndroidManifest.xml的manifest标签下添加
<uses-permission android:name="android.permission.INTERNET" />
  • iOS端:在ios/Runner/Info.plist的dict标签下添加
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

内容的提问来源于stack exchange,提问作者Shanmukha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:06:03