Flutter中local_auth在resumed状态下重复请求认证问题解决
解决local_auth在AppLifecycleState.resumed下无限触发认证弹窗的问题
问题根源是认证弹窗弹出时,应用状态会切换到inactive,认证完成后又切回resumed,导致didChangeAppLifecycleState被重复调用,进而无限触发认证请求。
解决方案
添加一个布尔变量标记当前是否正在进行认证,避免重复触发认证流程:
class _AppState extends State<App> with WidgetsBindingObserver { // 新增:标记当前是否处于认证流程中 bool _isAuthenticating = false; @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void didChangeAppLifecycleState(AppLifecycleState state) async { switch (state) { case AppLifecycleState.inactive: case AppLifecycleState.paused: case AppLifecycleState.detached: break; case AppLifecycleState.resumed: // 仅当未在认证时才触发认证请求 if (!_isAuthenticating) { _isAuthenticating = true; try { await _auth.authenticate( useErrorDialogs: true, stickyAuth: true, ); } finally { // 无论认证成功/失败,都重置标记,保证后续正常触发 _isAuthenticating = false; } } break; } } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } }
关键说明
_isAuthenticating标记确保同一时间只有一个认证流程在执行,阻断状态循环导致的重复请求。- 使用
try/finally块,保证即使用户取消认证或出现错误,标记也会被重置,不会影响后续应用从后台返回时的正常认证触发。
内容的提问来源于stack exchange,提问作者Tabarek Ghassan
相关产品推荐
相关产品推荐

