Flutter API网络请求代码运行报错,求错误排查与开发思路指导
代码存在的错误及说明
1. 字段类型不匹配
你调用的接口返回的userId字段为int类型,但User模型中将userId定义为String类型,JSON解析时会触发类型不匹配异常。
2. 空安全规则不兼容
在开启空安全的Dart版本中,User类的所有属性均声明为非空类型,但构造函数参数都是可选参数,没有加required修饰也没有设置默认值,User user = User() 这段初始化代码不符合空安全校验规则,会直接编译报错。同时你在视图层写的user == null判断永远不会生效,因为初始化时你给user赋值了空的User实例而非null,加载进度条永远不会展示。
3. 方法返回值类型缺失
getUser方法没有声明返回值类型,默认返回dynamic类型,后续解析异常时容易触发隐式类型转换错误。
4. 缺少异常处理逻辑
没有对网络请求、JSON解析过程做异常捕获,一旦网络请求失败或者返回非200状态码,代码会直接崩溃。
修复后的代码示例
修复后的User模型
class User{ int? userId; int? id; String? title; String? body; User({this.userId,this.id,this.title,this.body}); factory User.fromJson(Map<String, dynamic> parsedJson){ return User( userId: parsedJson["userId"], id: parsedJson["id"], title: parsedJson["title"], body: parsedJson["body"] ); } }
修复后的服务层代码
Future<User?> getUser() async{ try { var response = await http.get(Uri.parse("https://jsonplaceholder.typicode.com/posts/1")); if (response.statusCode == 200) { final jsonDecode = json.decode(response.body); return User.fromJson(jsonDecode); } return null; } catch(e) { print("请求或解析错误:$e"); return null; } }
修复后的主界面代码
class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { User? user; @override void initState() { super.initState(); getUser().then((value) { setState(() { user = value; }); }); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: user == null ? const CircularProgressIndicator() : Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text("${user?.id}"), Text("${user?.title}"), Text("${user?.userId}"), Text("${user?.body}"), ], ), ), ), ); } }
同类问题排查思路
- 优先查看控制台报错信息,报错会明确标注错误类型和触发位置,可直接定位问题代码段。
- 核对接口返回的JSON结构和字段类型,和本地模型定义逐一比对,确保字段名、字段类型完全匹配。
- 检查空安全相关声明是否正确,可空类型和非空类型的使用符合Dart语法规范。
- 网络请求类逻辑必须增加异常捕获逻辑,方便排查网络层面的问题。
内容的提问来源于stack exchange,提问作者oustW.
相关产品推荐
相关产品推荐

