You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:13:29