Flutter 颤振:如何同步同步静态方法和异步非静态方法?
当我启动应用程序时,它应该检查是否可以使用生物认证(指纹/面部id)。我有一个类来检查这个,登录页面需要它的结果。我有以下代码:Flutter 颤振:如何同步同步静态方法和异步非静态方法?,flutter,dart,Flutter,Dart,当我启动应用程序时,它应该检查是否可以使用生物认证(指纹/面部id)。我有一个类来检查这个,登录页面需要它的结果。我有以下代码: 使用ChangeNotifier类LocalAuthenticationUtil{ 静态本地身份验证_auth=LocalAuthentication(); 静态列表类型; 静态布尔哈维生物特征=真; bool_=true; 静态LocalAuthenticationUtil_实例; 静态LocalAuthenticationUtil getInstance(){ i
使用ChangeNotifier类LocalAuthenticationUtil{
静态本地身份验证_auth=LocalAuthentication();
静态列表类型;
静态布尔哈维生物特征=真;
bool_=true;
静态LocalAuthenticationUtil_实例;
静态LocalAuthenticationUtil getInstance(){
if(_instance==null){
_instance=LocalAuthenticationUtil();
打印(“GetInstance CanCheckBiometrics之前”);
_实例。_canCheckBiometrics();
打印(“GetInstance CanCheckBiometrics之后”);
if(生物特征识别){
_instance.addListener(){
_instance.authenticate();
});
_instance.authenticate();
}
}
返回_实例;
}
Future\u canCheckBiometrics()异步{
打印(“之前的CanCheckBiometrics”);
haveBiometrics=wait_auth.canCheckBiometrics;
打印(“之后的CanCheckBiometrics”);
if(生物特征识别){
生物特征类型=等待_auth.getAvailableBiometrics();
}
}
设置已验证的生物特征(布尔值){
如果(_!=值){
_生物特征=值;
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
您没有等待
ing\u实例。\u可以检查biometrics();
Dart同步执行,直到它到达一个await
,此时函数立即返回,但“记住它在哪里”,因此当await
edFuture
完成时,它可以继续它停止的位置:
在这里,当您调用\u instance.\u canCheckBiometrics()
时,它会立即运行第一条print
语句,然后点击wait\u auth.canCheckBiometrics
,并立即返回表示\u instance.\u canCheckBiometrics()
只需将\u实例替换为wait\u实例即可。\u canCheckBiometrics()
。\u canCheckBiometrics()
,它应该可以工作
顺便说一句,你可以创建一个analysis\u options.yaml
文件来为你的项目定制你的linter警告。特别是一个名为unawaited\u futures
的文件,当你在一个异步上下文中有一个Future
返回函数,而该函数没有wait
时,它会向你发出警告。这通常是一个错误,但你可以抑制i如果您确定,请不要手动执行。此规则通常有助于捕获这样的错误。
要使用过梁,请检查:cameron1024是正确的。
您需要做的是创建一个StatefulWidget,一旦检查完成,它将重定向用户
类AuthWidget扩展了StatefulWidget{
AuthWidget({Key}):超级(Key:Key);
@凌驾
_AuthWidgetState createState()=>\u AuthWidgetState();
}
类_AuthWidgetState扩展状态{
@凌驾
void initState(){
super.initState();
checkBiometrics();//异步执行检查,然后使用Navigator.of(context).push/replace
}
@凌驾
小部件构建(构建上下文){
//检查时显示加载程序
返回循环ProgressIndicator();
}
}
“wait\u instance.\u canCheckBiometrics()”-我不能,因为getInstance()方法不是异步的。如果我将其设置为异步的,我必须改变使用getInstance()方法的其他地方,以期待未来,而不是对象本身。如果要使用它,可能会导致其他未初始化的事情。。。