Flutter二级页面登出异常求助:数据库已登出但页面未跳转
问题原因分析
- 未清空核心认证变量:登出函数仅重置了
refreshToken和refreshTokenExpiryDate,但内存中的accessToken未被清空,导致isAuth的判断逻辑仍返回true,MaterialApp的Consumer不会触发页面切换到登录页。 - 导航栈未彻底清空:从用户页面登出时仅pop回首页,首页仍保留在导航栈中,即使
isAuth变为false,现有栈内页面会覆盖MaterialApp的home配置,无法自动跳转登录页。
具体修复方案
1. 完善登出函数,清空所有认证状态
修改logout函数,确保清空所有内存中的认证变量,并调整状态通知时机:
Future<void> logout() async { print('logout started'); final url = '${PurohitApi().baseUrl}${PurohitApi().login}/$sessionId'; var response = await http.delete( Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': accessToken! }, ); var userStatus = json.decode(response.body); print(userStatus); // 取消认证定时器 if (authTimer != null) { authTimer!.cancel(); authTimer = null; } // 清空所有内存中的认证变量 refreshToken = null; refreshTokenExpiryDate = null; accessToken = null; // 新增:清空accessToken sessionId = null; // 若sessionId参与认证逻辑,同步清空 // 清空本地存储的认证信息 final prefs = await SharedPreferences.getInstance(); await prefs.clear(); // 最后通知状态变化,确保所有变量已更新完成 notifyListeners(); }
2. 修改登出按钮逻辑,强制清空导航栈
在登出按钮的onTap事件中,执行登出后直接清空所有导航栈并跳转登录页:
ListTile( leading: const Icon(Icons.exit_to_app), title: const Text("Logout"), onTap: () async { Navigator.pop(context); // 关闭当前用户页面 await Provider.of<Auth>(context, listen: false).logout(); // 执行登出 // 清空所有导航栈,强制跳转登录页 Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => const Adminlogin()), (route) => false, // 条件为false表示清空所有历史页面 ); }, )
3. 验证isAuth的判断逻辑
确保Auth类中isAuth的getter正确依赖所有认证状态,示例如下:
bool get isAuth { // 根据实际认证逻辑调整,例如判断accessToken存在且未过期 return accessToken != null && (refreshTokenExpiryDate?.isAfter(DateTime.now()) ?? false); }
内容的提问来源于stack exchange,提问作者Santosh Kumar
相关产品推荐
相关产品推荐

