Flutter中返回类型为Future<Login?>的方法返回String报错如何解决?
报错根本原因
你声明的makeRequestLogin方法返回类型是Future<Login?>,意味着该方法只能返回Login类型实例或者null,但你在else分支直接返回了字符串类型的错误提示,类型不匹配才触发了编译报错。
可选解决方案
方案1:抛出异常,上层调用时捕获处理
这是最符合Dart异步编程规范的做法,把错误信息封装成异常抛出,上层调用时用try-catch捕获即可拿到错误提示:
Future<Login?> makeRequestLogin(String mobileNumber, String password) async { var response = await http.post(Uri.parse('$baseURL/customer/login'), body: { "phone_number": mobileNumber, "password": password, "registration_type": "normal" }); if (response.statusCode == 200) { final responseString = response.body; final data = jsonDecode(responseString); Login signUp = Login.fromJson(data); return signUp; } else { final responseString = response.body; var result = json.decode(responseString); String message = result["message"]; // 抛出异常替代直接返回 throw Exception(message); } }
上层调用示例:
// 上层调用时用try-catch捕获异常 try { Login? loginResult = await makeRequestLogin("13xxxxxxxxx", "123456"); // 登录成功后续逻辑 } catch (e) { // 拿到错误提示后可做弹窗、toast提示等处理 print(e.toString()); }
方案2:改造返回类型,封装成功/失败两种状态
创建通用的响应类,同时支持返回成功数据和错误信息,更适合复杂业务场景使用:
// 通用响应封装类 class ApiResponse<T> { final T? data; final String? errorMsg; ApiResponse.success(this.data) : errorMsg = null; ApiResponse.error(this.errorMsg) : data = null; }
修改方法的返回类型:
// 把返回类型改为封装后的ApiResponse<Login> Future<ApiResponse<Login>> makeRequestLogin(String mobileNumber, String password) async { var response = await http.post(Uri.parse('$baseURL/customer/login'), body: { "phone_number": mobileNumber, "password": password, "registration_type": "normal" }); if (response.statusCode == 200) { final responseString = response.body; final data = jsonDecode(responseString); Login signUp = Login.fromJson(data); return ApiResponse.success(signUp); } else { final responseString = response.body; var result = json.decode(responseString); String message = result["message"]; return ApiResponse.error(message); } }
上层调用写法:
ApiResponse<Login> resp = await makeRequestLogin("13xxxxxxxxx", "123456"); if (resp.data != null) { // 登录成功后续逻辑 } else { // 直接取resp.errorMsg做错误提示即可 }
方案3:临时快速修复(不推荐)
如果仅做临时调试,可以直接返回null,错误信息通过全局变量、参数回调等方式传递,该方式不符合单向数据流规范,不建议长期使用。
内容的提问来源于stack exchange,提问作者Mohammed Nabil
相关产品推荐
相关产品推荐

