Flutter中如何获取Future回调结果?登录API场景问题求助
问题原因及解决方法
你的问题出在**login方法的返回逻辑**上:虽然你在then回调里返回了正确的value.data.key,但这个返回值并没有传递到login方法的外层,最后方法总是执行return "";,所以调用方拿到的结果是空字符串。另外,混合使用await和then容易导致逻辑混淆,建议统一写法。
修复方案一:统一使用await(推荐)
修改login方法,直接用await获取API响应结果,然后返回对应值,异常处理用try-catch统一捕获:
Future<String> login(String account, String password) async { try { final response = await logon(account, password); print("key=${response.data.key}"); return response.data.key; // 直接返回API返回的key } catch (error) { print("error=$error"); return ""; // 异常时返回空字符串,也可根据需求返回特定错误标识 } }
修复方案二:保留then但修正返回逻辑
如果一定要用then,需要把then的执行结果作为login方法的返回值,因为then本身会返回一个Future:
Future<String> login(String account, String password) async { try { futureLogin = logon(account, password); // 返回then回调的结果 return await futureLogin.then((value) { print("key=${value.data.key}"); return value.data.key; }).catchError((error) { print("error=$error"); return ""; }); } catch (error) { print("error=$error"); return ""; } }
按钮点击事件调整(跳转逻辑)
你的按钮基础调用逻辑是对的,修复login方法后,await viewModel.login(...)就能拿到正确结果,之后可判断结果并跳转主页:
onPressed: () async { var result = await viewModel.login(account, password); print("result=${result}"); // 现在会打印正确的key或空字符串 if (result.isNotEmpty) { // 跳转到主页 Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage())); } }
内容的提问来源于stack exchange,提问作者GHH
相关产品推荐
相关产品推荐

