Flutter Dio注册接口返回null求助:数据库已创建用户但响应为空
问题分析与解决
你遇到的问题是变量作用域冲突导致返回null,具体看代码:
在DioClient的userRegistration方法里,你先在方法顶部声明了Response? userData;,但在try代码块里又重新定义了一个同名的局部变量:
Response userData = await WebUtil.createDio().post(...);
这个局部变量只在try块内有效,和方法顶部的userData不是同一个。所以即使try块里打印的userData有值,方法最后返回的还是顶部那个初始化为null的变量。
修复方法
把try块里的变量声明去掉,直接给方法顶部的userData赋值:
修改后的userRegistration方法:
Future<Response?> userRegistration({required RegisterInfoReq requestData}) async { Response? userData; try { // 去掉前面的Response,直接给外部的userData赋值 userData = await WebUtil.createDio().post('/Candidate/RegisterCandidate', data: requestData); if (kDebugMode) { print('User Info: ${userData}'); } } on DioError catch (e) { // 原错误处理代码不变 if (e.response != null) { if (kDebugMode) { print('Dio error!'); print('STATUS: ${e.response?.statusCode}'); print('DATA: ${e.response?.data}'); print('HEADERS: ${e.response?.headers}'); } } else { if (kDebugMode) { print('Error sending request!'); print(e.message); } } } return userData; }
额外优化建议
你也可以简化代码,不需要提前初始化userData,直接在try中获取值后返回,错误情况返回null或者处理后返回:
Future<Response?> userRegistration({required RegisterInfoReq requestData}) async { try { final userData = await WebUtil.createDio().post('/Candidate/RegisterCandidate', data: requestData); if (kDebugMode) { print('User Info: ${userData}'); } return userData; } on DioError catch (e) { // 错误处理代码 if (kDebugMode) { if (e.response != null) { print('Dio error!'); print('STATUS: ${e.response?.statusCode}'); print('DATA: ${e.response?.data}'); print('HEADERS: ${e.response?.headers}'); } else { print('Error sending request!'); print(e.message); } } return null; } }
这样修改后,调用页面就能获取到正确的响应数据了。
内容的提问来源于stack exchange,提问作者Saniyo Mathew
相关产品推荐
相关产品推荐

