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
相关产品推荐
相关产品推荐

