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

Flutter中创建Future函数的方法及Post请求函数返回非空类型报错的解决方案

解决Flutter Future函数返回非空类型的报错问题

这个错误在Dart空安全模式下很常见,我来帮你分析并解决它:

问题根源

你的makePostRequest函数声明返回非空的String类型(Future<String>),但Dart的空安全检查发现存在代码路径没有返回值或抛出异常,会默认返回null,这和你声明的返回类型冲突。具体来说:

  • 错误分支(error.toString() != "[]")只给requestResult赋值,但没有返回这个值
  • 当error和data都为空数组时,函数走到最后没有任何返回或抛出逻辑

修复后的完整代码

Future<String> makePostRequest() async {
  String requestResult;
  var body = this.toMapRequest();
  String requestUrl = RequestZarinpal.PAYMENT_REQUEST_URL;
  String gateWayUrl;
  String jsonBody = json.encode(body);
  final encoding = Encoding.getByName('utf-8');
  
  try {
    Response response = await post(
      requestUrl,
      headers: headers,
      body: jsonBody,
      encoding: encoding,
    ).timeout(
      const Duration(seconds: 10),
      onTimeout: () {
        throw TimeoutException('The connection has timed out, Please try again!');
      },
    );

    String responseBody = response.body; // 补全变量声明
    var parsedJson = json.decode(responseBody);
    var data = parsedJson['data'];
    var error = parsedJson['errors'];

    if (error.toString() != "[]") {
      var errorcode = parsedJson['errors']['code'];
      print("$body va $requestUrl va $parsedJson");
      requestResult = " شما ارور زیر را دریافت کرده اید \n$error";
      return requestResult; // 错误分支添加return
    } else if (data.toString() != "[]") {
      var authority = parsedJson['data']['authority'];
      requestResult = "اتوریتی شما با موفقیت ساخته شد و به درگاه متصل می شود";
      _request.setAuthority(authority);
      print(parsedJson);
      String gateWay = RequestZarinpal.PAYMENT_GATEWAY_URL;
      gateWayUrl = "$gateWay$authority";
      
      if (await canLaunch(gateWayUrl)) {
        await launch(
          gateWayUrl,
          forceSafariVC: false,
          forceWebView: false,
          headers: headers,
        );
      } else {
        throw 'Could not launch $gateWayUrl'; // 修正url为gateWayUrl
      }
      
      print(requestResult);
      return requestResult;
    } else {
      // 处理既无错误也无数据的边界情况
      throw Exception('Unexpected response format: no data or error found');
      // 或者返回错误字符串:
      // return 'خطا: پاسخ غیرمنتظره از سرور دریافت شد';
    }
  } catch (e) {
    // 统一捕获所有异常,返回对应的错误信息
    requestResult = "خطا: ${e.toString()}";
    return requestResult;
  }
}

关键修改点说明

  1. 错误分支添加return:在if (error.toString() != "[]")分支末尾添加return requestResult;,确保错误情况有明确返回值
  2. 处理边界情况:新增else分支,处理既无错误也无数据的异常场景,要么抛出异常,要么返回错误字符串
  3. 补全变量声明:修正responseBody未提前声明的问题
  4. 统一异常处理:将整个请求逻辑包裹在try-catch中,捕获所有异常(超时、解析错误等)并返回对应信息,避免函数意外返回null
  5. 修正url错误:把throw 'Could not launch $requestUrl';中的url改为正确的gateWayUrl

这样修改后,所有代码路径都有明确的返回值或异常抛出,Dart的空安全检查就不会再报错了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:52:31