【问题标题】:is it possible to use await in a sync function in dart是否可以在飞镖的同步功能中使用等待
【发布时间】: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&lt;bool&gt; get isLogin async {会怎样
  • 1. await 是一个上下文关键字,仅与async 一起启用,因此根据定义,如果没有async,就不可能使用await。 2. await 是设置Future.then() 回调的语法糖。 3. 如果您想要一个不需要的即发即弃异步函数,或者希望调用者在它完成时得到通知,只需将您的函数设置为 asyncvoid 返回类型。
  • 如果我将函数更改为异步,许多相关的地方必须通过此更改进行更改。 @ThomasAnderson
  • 我发现一个函数 waitFor 应该这样做,但它似乎不应该在颤振客户端中使用。代码应如下所示:String phone = waitFor&lt;String&gt;(Future.value());@jamesdlin
  • 强烈建议不要使用waitFor。你要么必须接受你的调用者必须await你的函数的结果,要么你应该重新设计你的API,以便单独初始化值。

标签: flutter dart


【解决方案1】:

尝试用

替换你的函数签名
Future<bool> get isLogin async {

【讨论】:

  • 我不能这样改,太多地方调用这个函数,如果我改了,这么多地方应该跟着这个变化改。@Thomas Anderson
【解决方案2】:
Timer timer;

@override
void initState() {
  super.initState();
  timer = new Timer.periodic(new Duration(seconds: 1), (Timer timer) async {
      await this.getUserVerificationInfo();
  });
}

@override
void dispose() {
    super.dispose();
    timer.cancel();
}

getUserVerificationInfo() async {
   await someAsyncFunc();
   timer.cancle();
}

【讨论】:

  • Timer 是多余的。它增加了额外的延迟,但对仅调用 someAsyncFunc() 而没有 await 没有任何好处。
猜你喜欢
  • 2021-09-05
  • 2019-03-05
  • 2019-05-07
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 2014-07-04
相关资源
最近更新 更多