Flutter Android发布版GoRouter.go登出后重登导航失效问题
Flutter OAuth2 Client 登出后再次登录无法导航至首页问题(Android发布版专属)
问题场景
- 应用流程:
- 启动页进入设置页,用户输入服务器URL后获取SSO配置传入
oauth2_client;触发登录后,WebView打开SSO登录页,登录成功回调至设置页,验证token后通过AppRouter.router.go(AppRouter.home)跳转首页(首次登录正常) - 首页进入个人页执行登出:调用登出函数后通过
AppRouter.router.go(AppRouter.settingsPage)返回设置页 - 异常表现:登出后再次登录,token验证成功,但
go方法无法跳转至首页
- 启动页进入设置页,用户输入服务器URL后获取SSO配置传入
- 特殊现象:
- 登出后重启APP,再次登录可正常跳转
- 仅Android发布版存在该问题,调试版无异常
- 已尝试无效方案:切换
go/push等导航方法、登出后清空页面栈再跳转至设置页
可能原因
- OAuth2 Client与WebView状态残留
Android发布版下,oauth2_client的WebView可能保留了登录会话缓存,或者客户端凭证状态未彻底重置,导致回调逻辑触发异常分支,干扰导航执行。调试版因缓存策略宽松,无此问题。 - 路由栈状态未彻底重置
发布版代码优化(如混淆、tree shaking)可能导致路由栈的内部状态未被正确清空,即使调用跳转方法,路由框架仍认为当前页面无需变更。 - 异步逻辑执行顺序异常
发布版Dart编译的优化可能改变了token验证后导航代码的执行时机,比如异步回调被延迟或合并,导致导航操作被UI线程忽略。 - WebView会话清理不彻底
登出仅清理了本地token,但未清除WebView的Cookie、会话存储,SSO服务器仍认为用户处于登录状态,回调后的逻辑跳过了导航步骤。
解决方案建议
彻底重置OAuth2状态与WebView缓存
登出时主动清除OAuth2凭证,并清理WebView的Cookie和缓存:// 清除OAuth2客户端凭证 await oauthClient.clearCredentials(); // Android平台清理WebView数据 if (Platform.isAndroid) { await WebViewCookieManager().clearCookies(); final controller = WebViewController(); await controller.clearCache(); await controller.clearLocalStorage(); }需确保已引入
webview_flutter依赖。强制重置路由栈至设置页
登出时使用路由框架的栈清空方法,确保路由栈中仅保留设置页:// 以GoRouter为例,完全替换路由栈 AppRouter.router.replaceAll([AppRouter.settingsPage]);若使用其他路由框架,对应调用清空栈并跳转的方法(如
pushAndRemoveUntil)。确保导航操作在主线程执行
将导航代码包裹在主线程回调中,避免发布版异步逻辑导致的UI操作延迟:// token验证成功后执行导航 WidgetsBinding.instance.addPostFrameCallback((_) { AppRouter.router.go(AppRouter.home); });禁用WebView相关代码混淆
在android/app/proguard-rules.pro中添加WebView与OAuth2相关的混淆豁免规则:-keep class io.flutter.plugins.webviewflutter.** { *; } -keep class org.chromium.** { *; } -keep class com.example.your_oauth2_package.** { *; } // 替换为你的oauth2_client相关包路径同时确保
build.gradle中发布版的混淆规则包含上述文件。调用SSO服务器登出API
登出时除了本地清理,还需调用SSO服务器的登出接口,销毁服务器端会话,避免WebView回调时因会话残留触发异常逻辑。
内容的提问来源于stack exchange,提问作者isandoqa
相关产品推荐
相关产品推荐

