【发布时间】:2021-10-30 07:20:11
【问题描述】:
我有一个获取用户登录状态的功能,现在我想在检查用户没有登录时添加一个静默登录的逻辑。用户登录后,我将有关用户名和密码的登录信息存储到本地安全存储中用户第一次登录后,调用islogin函数时,我的代码如下所示:
bool get isLogin {
if(this == null){
// not login, do the automatic login logic
final UserAccount userAccount = UserAccount();
final String? phone = await SecureStorageUtil.getString("username");
final String? password = await SecureStorageUtil.getString("password");
if(phone == null || password == null){
return false;
}
final Result<Map> result = await userAccount.login(phone, password);
if(result != null){
return true;
}
}
return this != null;
}
让我卡住的是获取凭据信息和登录是异步的,并且必须使用 await 关键字来等待返回。但是 await 关键字只允许在异步函数中使用。
The await expression can only be used in an async function.
如果我将isLogin 函数更改为异步,则该项目中的许多地方都必须更改。我想知道是否可以在同步功能中使用等待?所以如果用户只登录一次,我可以进行自动登录。并且没有对之前的代码做任何改动。
【问题讨论】:
-
如果尝试将函数签名替换为
Future<bool> get isLogin async {会怎样 -
1.
await是一个上下文关键字,仅与async一起启用,因此根据定义,如果没有async,就不可能使用await。 2.await是设置Future.then()回调的语法糖。 3. 如果您想要一个不需要的即发即弃异步函数,或者希望调用者在它完成时得到通知,只需将您的函数设置为async与void返回类型。 -
如果我将函数更改为异步,许多相关的地方必须通过此更改进行更改。 @ThomasAnderson
-
我发现一个函数 waitFor 应该这样做,但它似乎不应该在颤振客户端中使用。代码应如下所示:
String phone = waitFor<String>(Future.value());@jamesdlin -
强烈建议不要使用
waitFor。你要么必须接受你的调用者必须await你的函数的结果,要么你应该重新设计你的API,以便单独初始化值。