Flutter local_auth ничего не делает, если результат неверный - PullRequest
0 голосов
/ 17 апреля 2020

Я прошу, чтобы пользователь был идентифицирован по отпечатку пальца, и все в порядке, если он касается правым пальцем, но если коснуться не тем пальцем, функция не возвращает ничего и не исключение

Future<bool> _authenticate(BuildContext context) async {
    bool authenticated = false;

    try {
        IOSAuthMessages iosStrings = IOSAuthMessages(
            cancelButton: AppLocalizations.getString(context, 'cancel'),
            goToSettingsButton: AppLocalizations.getString(context, 'settings'),
            goToSettingsDescription: "אין טביעות אצבע רשומות במכשירך.\nעבור ל'הגדרות > אבטחה' בכדי להוסיף עכשיו.",
            lockOut: 'הפעל מחדש את את זיהוי טביעת האצבע שלך.',
        );

        AndroidAuthMessages androidStrings = AndroidAuthMessages(
            signInTitle: "הזדהות עם טביעת אצבע",
            fingerprintHint: "",//"""הנח את האצבע על חיישן ההזדהות",
            fingerprintNotRecognized: "לא זוהה",
            fingerprintSuccess: "טביעת האצבע זוהתה בהצלחה",
            fingerprintRequiredTitle: "נדרשת טביעת אצבע רשומה",
            goToSettingsDescription: "אין טביעות אצבע רשומות במכשירך.\nעבור ל'הגדרות > אבטחה' בכדי להוסיף עכשיו.",
            goToSettingsButton: AppLocalizations.getString(context, 'settings'),
            cancelButton: AppLocalizations.getString(context, 'cancel'),
        );

        authenticated = await _localAuth.authenticateWithBiometrics(
            localizedReason: '',
            useErrorDialogs: true,
            stickyAuth: true,
            iOSAuthStrings: iosStrings,
            androidAuthStrings: androidStrings,
        );
    }
    on PlatformException catch (e) {
        print('[SecurityPage PlatformException]: $e');
    }
    catch(e) {
        print('[SecurityPage]: $e');
    }

    print(authenticated);

    if(!authenticated) _authTries++;
    return authenticated;
}

Future _showAuthDialog({bool canClose = true, Widget icon, Widget text}) => showGeneralDialog(
    context: context,
    pageBuilder: (context, animation1, animation2) => Container(),
    barrierDismissible: false,
    barrierColor: Colors.black.withOpacity(0.5),
    transitionDuration: Duration(milliseconds: 200),
    transitionBuilder: (context, a1, a2, widget) => WillPopScope(
        onWillPop: () async => false,
        child: Transform(
            transform: Matrix4.translationValues(0.0, (Curves.fastOutSlowIn.transform(a1.value) - 1.0) * 200, 0.0),
            child: Opacity(
                opacity: a1.value,
                child: Column(
                    mainAxisSize: MainAxisSize.max,
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                        Material(
                            color: Colors.transparent,
                            child: Container(
                                margin: EdgeInsets.symmetric(horizontal: 25),
                                padding: EdgeInsets.only(left: 15, right: 15, top: 10, bottom: 20),
                                color: AppThemes.getAppBarColor(context),
                                child: Column(
                                    mainAxisSize: MainAxisSize.min,
                                    mainAxisAlignment: MainAxisAlignment.center,
                                    crossAxisAlignment: CrossAxisAlignment.center,
                                    children: <Widget>[
                                        if(canClose) Row(
                                            mainAxisSize: MainAxisSize.max,
                                            mainAxisAlignment: MainAxisAlignment.end,
                                            children: <Widget>[
                                                IconButton(
                                                    icon: Icon(Icons.close, color: AppThemes.getTextColor(context), size: 24,),
                                                    onPressed: () async {
                                                        _localAuth.stopAuthentication();
                                                        Navigator.pop(context);
                                                    },
                                                ),
                                            ],
                                        ),
                                        icon ?? Icon(Icons.fingerprint, color: AppSettings.colorPrimary, size: 64,),
                                        SizedBox(height: 15,),
                                        Text(
                                            'הזדהות עם טביעת אצבע',
                                            style: TextStyle(
                                                fontSize: 18,
                                                fontWeight: FontWeight.w600,
                                                color: AppThemes.getTextColor(context),
                                            ),
                                        ),
                                        SizedBox(height: 5,),
                                        Padding(
                                            padding: EdgeInsets.symmetric(horizontal: 15),
                                            child: Divider(color: Colors.grey,),
                                        ),
                                        SizedBox(height: 5,),
                                        text ?? Text(
                                            'הנח את האצבע על חיישן ההזדהות',
                                            style: TextStyle(
                                                fontSize: 14,
                                                color: AppThemes.getTextColor(context),
                                            ),
                                        ),
                                    ],
                                ),
                            ),
                        ),
                    ],
                ),
            ),
        ),
    ),
);

Future<void> _doAuth(BuildContext context) async {
    if(AppSettings.canUseFingerprint && AppSettings.lockMode == AppLockMode.fingerprint) {
        _showAuthDialog();

        setState(() {
            _firstTimeAuth = true;
        });

        var auth = await _authenticate(context);
        if(auth != null && auth) {
            Navigator.pop(context); // Close AuthDialog

            _showAuthDialog(
                canClose: false,
                icon: Icon(Icons.fingerprint, color: Colors.green, size: 64,),
                text: Text('טביעת האצבע זוהתה בהצלחה', style: TextStyle(fontSize: 14, color: AppThemes.getTextColor(context),),),
            );
            Future.delayed(Duration(seconds: 2), () {
                Navigator.pop(context); // Close AuthDialog

                if(widget.firstAuth == false) {
                    Navigator.pop(context, true);
                }
                else {
                    Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => SplashScreenPage(),),);
                }
            });
        }
        else {
            if (_authTries >= 3) {
                await _localAuth.stopAuthentication();
            }
        }
    }
}

Я имею застрял на нем в течение нескольких дней без решения и протестирован на некоторых Android устройствах (OP 7T и MI9T)

Я отмечаю, что использую старую версию, поскольку в обновленной версии есть отпечаток пальца проблема исчезновения с экрана, если вы указали не тем пальцем и у вас по-прежнему та же проблема, о которой я упоминал в обновленной версии

...