Flutter LocalAuthentication报authenticateWithBiometrics未定义错误
报错原因
该报错由local_auth依赖包的破坏性API变更导致:local_auth 2.0.0及以上版本正式移除了旧版的authenticateWithBiometrics方法,将生物识别、设备密码/PIN等所有本地认证能力统一整合到了新的authenticate方法中,调用已被删除的旧方法就会触发该编译错误。
同时当前代码中从flutter_local_auth_invisible包导入AndroidAuthMessages的写法也存在兼容问题:高版本local_auth已经将各平台的认证提示文案类拆分到了对应的官方平台实现包中,不需要再从第三方衍生包导入相关类。
修复步骤
- 调整依赖配置:在
pubspec.yaml中升级local_auth到2.x版本,同时添加官方平台实现包依赖,配置完成后执行flutter pub get拉取依赖:
dependencies: flutter: sdk: flutter local_auth: ^2.1.7 local_auth_android: ^1.0.35 local_auth_darwin: ^1.2.4
- 修正导入语句:删除代码中
import 'package:flutter_local_auth_invisible/auth_strings.dart';这行无效导入,替换为官方包的导入。 - 替换认证调用逻辑:将原来的
authenticateWithBiometrics调用替换为新的authenticate方法,传入biometricOnly: true参数保持原有“仅允许生物识别认证”的逻辑,原有useErrorDialogs、stickyAuth等参数统一移动到AuthenticationOptions配置类中传入。 - 补全iOS权限配置:打开iOS项目的
ios/Runner/Info.plist文件,添加Face ID权限描述,否则运行到iOS设备会触发权限崩溃:
<key>NSFaceIDUsageDescription</key> <string>需要使用面容ID完成身份验证</string>
修复后的完整可运行代码如下:
import 'package:flutter/services.dart'; import 'package:local_auth/local_auth.dart'; import 'package:local_auth_android/local_auth_android.dart'; import 'package:local_auth_darwin/local_auth_darwin.dart'; class LocalAuthApi { static final _auth = LocalAuthentication(); static Future<bool> hasBiometrics() async { try { return await _auth.canCheckBiometrics; } on PlatformException catch (e) { return false; } } static Future<bool> authenticate() async { final isAvailable = await hasBiometrics(); if (!isAvailable) return false; try { return await _auth.authenticate( authMessages: const [ AndroidAuthMessages( signInTitle: 'Face ID Required', ), IOSAuthMessages( cancelButton: '取消', ), ], localizedReason: 'Scan Face to Authenticate', options: const AuthenticationOptions( biometricOnly: true, useErrorDialogs: false, stickyAuth: false, ), ); } on PlatformException catch (e) { return false; } } }
内容的提问来源于stack exchange,提问作者David Babalola
相关产品推荐
相关产品推荐

