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
相关产品推荐
相关产品推荐

