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

Flutter Http Post请求遇警告:返回null与FutureOr<DataModel>非空类型冲突

问题分析与解决

警告原因

你遇到的警告有两个核心原因:

  1. 当接口返回状态码201时,你调用了dataModelFromJson但没有返回解析后的DataModel对象,方法执行到这里会继续往下走,最终无返回值(默认返回null),但方法返回类型是Future<DataModel>(非空类型),不符合要求。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:56:09