flutter - 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
解决方案
你不await
ing_instance._canCheckBiometrics();
Dart 同步执行,直到它遇到await
,此时函数立即返回,但“记住它的位置”,因此它可以在await
edFuture
完成时从中断的地方继续:
在这里,当您调用 时_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
推荐阅读
- java - 如何过滤页面流
通过 Spring Boot 应用程序中的流 Java 11 API - python - rpy2 2.9.4版安装错误使用conda
- c - 在 C 中用 memcpy 替换 for 循环不起作用
- swiftui - macCatalyst 应用程序构建但不会在 Mac 上启动
- reactjs - Apex 图表不会立即显示
- python - 尝试使用附加,当我尝试打印附加创建的列表时,它显示“无”
- css - Css - div内图像的垂直居中
- android - 活动设备数量似乎很少
- azure-cognitive-services - 为什么说话识别分数是0
- node.js - 在我们的前置 lambda 中冷启动超过 1 秒