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; } }
关键修改点说明
- 错误分支添加return:在
if (error.toString() != "[]")分支末尾添加return requestResult;,确保错误情况有明确返回值 - 处理边界情况:新增
else分支,处理既无错误也无数据的异常场景,要么抛出异常,要么返回错误字符串 - 补全变量声明:修正
responseBody未提前声明的问题 - 统一异常处理:将整个请求逻辑包裹在
try-catch中,捕获所有异常(超时、解析错误等)并返回对应信息,避免函数意外返回null - 修正url错误:把
throw 'Could not launch $requestUrl';中的url改为正确的gateWayUrl
这样修改后,所有代码路径都有明确的返回值或异常抛出,Dart的空安全检查就不会再报错了。
内容的提问来源于stack exchange,提问作者asal rad
相关产品推荐
相关产品推荐

