如何解决在Future builder中使用本地身份验证后,身份验证后将无限次调用本地身份验证
我正在尝试使用本地身份验证来对用户进行身份验证,然后再使用该应用程序。但是问题是我必须使用Future Builder来检查用户数据才能转到主屏幕或登录屏幕。因此,我必须在Future Builder中使用本地身份验证来对用户进行身份验证。但这也会导致我也到达主屏幕后无限次调用指纹身份验证。因此,我们无法摆脱本地身份验证。请帮助并告知是否还有其他解决方法。在此先感谢:)
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final AuthMethods _authMethods = AuthMethods();
final LocalAuthentication _localAuthentication = LocalAuthentication();
bool _hasFingerPrintSupport = false;
bool _authorizedOrNot = false;
List<BiometricType> _availableBuimetricType = List<BiometricType>();
@override
void initState() {
super.initState();
_getBiometricsSupport();
_getAvailableSupport();
}
Future<void> _getBiometricsSupport() async {
bool hasFingerPrintSupport = false;
try {
hasFingerPrintSupport = await _localAuthentication.canCheckBiometrics;
} catch (e) {
print(e);
}
if (!mounted) return;
setState(() {
_hasFingerPrintSupport = hasFingerPrintSupport;
});
}
Future<void> _getAvailableSupport() async {
List<BiometricType> availableBuimetricType = List<BiometricType>();
try {
availableBuimetricType =
await _localAuthentication.getAvailableBiometrics();
} catch (e) {
print(e);
}
if (!mounted) return;
setState(() {
_availableBuimetricType = availableBuimetricType;
});
}
Future<void> _authenticateMe() async {
bool authenticated = false;
try {
authenticated = await _localAuthentication.authenticateWithBiometrics(
localizedReason: "Authenticate to use App",// message for dialog
useErrorDialogs: true,// show error in dialog
stickyAuth: false,// native process
);
} catch (e) {
print(e);
}
if (!mounted) return;
setState(() {
_authorizedOrNot = authenticated ? true : false;
});
}
@override
Widget build(BuildContext context) {
final themeNotifier = Provider.of<ThemeNotifier>(context);
_authenticateMe();
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => ThemeNotifier(darkTheme),),ChangeNotifierProvider(create: (_) => ImageUploadProvider()),ChangeNotifierProvider(
create: (_) => VideoUploadProvider(),ChangeNotifierProvider(create: (_) => UserProvider()),],child: MaterialApp(
title: "App",debugShowCheckedModeBanner: false,initialRoute: '/',routes: {
'/search_screen': (context) => SearchScreen(),'/setting_page': (context) => settingPage(),},theme: themeNotifier.getTheme(),home: FutureBuilder(
future: _authMethods.getCurrentUser(),builder: (context,AsyncSnapshot<User> snapshot) {
if (snapshot.hasData ) {
return _authorizedOrNot==true ? HomeScreen() : Container();
} else {
return LoginScreen();
}
},);
}
}
解决方法
在这种情况下,您可以在build()的开头调用_authenticateMe();
。
_authenticateMe();
在setState内部,这会导致build()重新触发并调用_authenticateMe();
从而进行重建。
P.S。我会将FutureBuilder向上移动直到在MaterialApp上方,这可能会导致使用热重装时出现问题。
,好吧,我想出了一种方法,方法是在init状态下调用authenticate函数,然后在返回Future builder之前检查isauthorizedorNot。 这是代码:-
class _MyAppState extends State<MyApp> {
final LocalAuthentication _localAuthentication = LocalAuthentication();
final AuthMethods _authMethods = AuthMethods();
bool _authorizedOrNot ;
Future<void> _authenticateMe() async {
bool authenticated = false;
try {
authenticated = await _localAuthentication.authenticateWithBiometrics(
localizedReason: "Authenticate to use app",useErrorDialogs: true,stickyAuth: false,);
} catch (e) {
print(e);
}
if (!mounted) return;
setState(() {
_authorizedOrNot = authenticated ? true : false;
});
}
@override
void initState() {
super.initState();
_authenticateMe();
}
@override
Widget build(BuildContext context) {
final themeNotifier = Provider.of<ThemeNotifier>(context);
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => ThemeNotifier(darkTheme),),ChangeNotifierProvider(create: (_) => ImageUploadProvider()),ChangeNotifierProvider(
create: (_) => VideoUploadProvider(),ChangeNotifierProvider(create: (_) => UserProvider()),],child: MaterialApp(
title: "App",debugShowCheckedModeBanner: false,initialRoute: '/',routes: {
'/search_screen': (context) => SearchScreen(),'/setting_page': (context) => settingPage(),},theme: themeNotifier.getTheme(),home: _authorizedOrNot==true ? FutureBuilder(
future: _authMethods.getCurrentUser(),builder: (context,AsyncSnapshot<User> snapshot) {
if (snapshot.hasData) {
return HomeScreen();
} else {
return LoginScreen();
}
},) : ( Container(child: Center(child: CircularProgressIndicator()),)
),)
);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。