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

Flutter实现每5秒异步检查登录状态并处理登出逻辑

实现Flutter定时检测登录状态并自动登出

核心思路

用Timer.periodic实现每5秒轮询一次登录状态,检测到状态为0时执行登出逻辑并跳转至登录页面,同时加入异常捕获避免定时任务崩溃。

具体实现步骤

1. 声明定时器变量

在页面的State类中添加Timer变量,用于控制定时任务的启动与取消:

Timer? _loginCheckTimer;

2. 修改getLoginState函数,加入状态判断与跳转逻辑

更新原函数,补充状态检测、异常处理以及登出跳转的核心逻辑:

void getLoginState() async {
  try {
    await sqlConnect();

    var res = await SqlConn.readData(
      "declare @LoginState bit declare @Status nvarchar(4000) exec spHandheldLogin '${userController.text}', '${passwordController.text}', @LoginState output, @Status output"
    );

    res = json.decode(res);
    res = res[0];
    var loginState = res['LoginState'];
    var status = res['Status'];

    // 检测到登录状态为0时执行登出流程
    if (loginState == 0) {
      // 执行登出操作:清除本地缓存的用户信息、Token等
      // 示例:await SharedPreferences.getInstance().then((prefs) => prefs.clear());
      
      // 取消定时任务,避免后续无效检测
      _loginCheckTimer?.cancel();
      
      // 跳转至登录页面,替换当前路由栈防止返回原页面
      Navigator.pushReplacementNamed(context, '/login');
    }

    await sqlDisconnect();
  } catch (e) {
    // 捕获异常,防止单个检测失败导致定时任务终止
    print('登录状态检测失败: $e');
    // 可选:异常时可添加重试逻辑或短暂暂停检测
  }
}

3. 启动与停止定时任务

  • 用户登录成功后启动定时检测:
// 登录成功后调用此方法启动定时任务
void startLoginCheckTimer() {
  // 先取消已有定时器,避免重复创建
  _loginCheckTimer?.cancel();
  // 每5秒执行一次登录状态检测
  _loginCheckTimer = Timer.periodic(const Duration(seconds: 5), (timer) {
    getLoginState();
  });
}
  • 在页面销毁或用户主动登出时,务必取消定时器避免内存泄漏:
@override
void dispose() {
  _loginCheckTimer?.cancel();
  super.dispose();
}

优化建议

  • 频繁连接/断开SQL Server会消耗资源,可考虑保持长连接,避免每次检测都执行sqlConnect和sqlDisconnect。
  • 若userController或passwordController在页面销毁后失效,建议将用户名密码缓存到本地(如SharedPreferences),避免依赖控制器实例。
  • 可添加重试机制,当检测失败时延迟一段时间再重试,避免频繁报错。

内容的提问来源于stack exchange,提问作者TheMortiestMorty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:05:10