Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:如何同步同步静态方法和异步非静态方法?_Flutter_Dart - Fatal编程技术网

Flutter 颤振:如何同步同步静态方法和异步非静态方法?

Flutter 颤振:如何同步同步静态方法和异步非静态方法?,flutter,dart,Flutter,Dart,当我启动应用程序时,它应该检查是否可以使用生物认证(指纹/面部id)。我有一个类来检查这个,登录页面需要它的结果。我有以下代码: 使用ChangeNotifier类LocalAuthenticationUtil{ 静态本地身份验证_auth=LocalAuthentication(); 静态列表类型; 静态布尔哈维生物特征=真; bool_=true; 静态LocalAuthenticationUtil_实例; 静态LocalAuthenticationUtil getInstance(){ i

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

使用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
ed
Future
完成时,它可以继续它停止的位置:

在这里,当您调用
\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()方法的其他地方,以期待未来,而不是对象本身。如果要使用它,可能会导致其他未初始化的事情。。。