首页 > 解决方案 > Flutter:如何同步同步静态方法和异步非静态方法?

问题描述

当我启动应用程序时,它应该检查是否可以使用生物特征认证(指纹/面部 ID)。我有一个检查这个的类,登录页面需要它的结果。我有以下代码:

class LocalAuthenticationUtil with ChangeNotifier {
  static LocalAuthentication _auth = LocalAuthentication();
  static List<BiometricType> biometricTypes;
  static bool haveBiometrics = true;
  bool _biometricAuthenticated = true;

  static LocalAuthenticationUtil _instance;

  static LocalAuthenticationUtil getInstance() {
    if (_instance == null) {
      _instance = LocalAuthenticationUtil();
      print("GetInstance CanCheckBiometrics before");
      _instance._canCheckBiometrics();
      print("GetInstance CanCheckBiometrics after");
      if (haveBiometrics) {
        _instance.addListener(() {
          _instance.authenticate();
        });
        _instance.authenticate();
      }
    }

    return _instance;
  }

  Future<void> _canCheckBiometrics() async {
    print("CanCheckBiometrics before");
    haveBiometrics = await _auth.canCheckBiometrics;
    print("CanCheckBiometrics after");
    if (haveBiometrics) {
      biometricTypes = await _auth.getAvailableBiometrics();
    }
  }

  set biometricAuthenticated(bool value) {
    if (_biometricAuthenticated != value) {
      _biometricAuthenticated = value;
      notifyListeners();
    }
  }

当代码运行时,结果如下:

I/flutter (23495): GetInstance CanCheckBiometrics before
I/flutter (23495): CanCheckBiometrics before
I/flutter (23495): GetInstance CanCheckBiometrics after
I/flutter (23495): CanCheckBiometrics after

虽然我想要发生的顺序是:

I/flutter (23495): GetInstance CanCheckBiometrics before
I/flutter (23495): CanCheckBiometrics before
I/flutter (23495): CanCheckBiometrics after
I/flutter (23495): GetInstance CanCheckBiometrics after

标签: flutterdart

解决方案


你不awaiting_instance._canCheckBiometrics();

Dart 同步执行,直到它遇到await,此时函数立即返回,但“记住它的位置”,因此它可以在awaitedFuture完成时从中断的地方继续:

在这里,当您调用 时_instance._canCheckBiometrics(),它会立即运行第一条print语句,然后点击await _auth.canCheckBiometrics并立即返回一个Future表示 的结果_instance._canCheckBiometrics()

只需替换_instance._canCheckBiometrics()await _instance._canCheckBiometrics()它应该可以工作。

顺便说一句,您可以创建一个analysis_options.yaml文件来为您的项目自定义 linter 警告。特别是,unawaited_futures当您Future在没有await. 这通常是一个错误,但如果您确定,您可以手动取消它。此规则通常有助于捕获此类错误。要使用 linter,请查看:https ://dart.dev/guides/language/analysis-options#enabling-linter-rules


推荐阅读