微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Future builder中使用本地身份验证后,身份验证后将无限次调用本地身份验证

如何解决在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 举报,一经查实,本站将立刻删除。