Flutter Http Post请求遇警告:返回null与FutureOr<DataModel>非空类型冲突
问题分析与解决
警告原因
你遇到的警告有两个核心原因:
- 当接口返回状态码201时,你调用了
dataModelFromJson但没有返回解析后的DataModel对象,方法执行到这里会继续往下走,最终无返回值(默认返回null),但方法返回类型是Future<DataModel>(非空类型),不符合要求。 else分支返回了null,同样和非空的返回类型冲突。
另外注意:原代码中Uri.https('reqres.in')缺少具体接口路径,reqres.in的创建用户接口是/api/users,不补充会导致请求失败(返回404)。
解决方案
方案一:允许返回可空的DataModel
将方法返回类型改为Future<DataModel?>,允许返回null,同时在调用时处理null情况:
修改后的submitData方法:
Future<DataModel?> submitData(String name, String job) async{ // 补充接口路径/api/users var response = await http.post(Uri.https('reqres.in', '/api/users'), body: {"name":name, "job":job}); print(response.body); if(response.statusCode == 201){ String responseString = response.body; // 返回解析后的DataModel对象 return dataModelFromJson(responseString); } else { return null; } }
修改后的按钮调用代码:
ElevatedButton( onPressed: () async{ String name = nameController.text; String job = jobController.text; // 变量改为可空类型DataModel? DataModel? data = await submitData(name, job); if(data != null){ setState(() { _dataModel = data; }); } else { // 提交失败时显示提示 ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('提交失败,请检查输入')) ); } }, child: const Text("submit"), ),
方案二:抛出异常替代返回null
保持方法返回类型为Future<DataModel>(非空),当请求失败时抛出异常,调用时用try-catch捕获:
修改后的submitData方法:
Future<DataModel> submitData(String name, String job) async{ var response = await http.post(Uri.https('reqres.in', '/api/users'), body: {"name":name, "job":job}); print(response.body); if(response.statusCode == 201){ String responseString = response.body; return dataModelFromJson(responseString); } else { // 抛出异常,包含错误信息 throw Exception('提交失败,状态码:${response.statusCode}'); } }
修改后的按钮调用代码:
ElevatedButton( onPressed: () async{ String name = nameController.text; String job = jobController.text; try { DataModel data = await submitData(name, job); setState(() { _dataModel = data; }); } catch(e) { // 捕获异常并提示 ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(e.toString())) ); } }, child: const Text("submit"), ),
内容的提问来源于stack exchange,提问作者iremy
相关产品推荐
相关产品推荐

