Flutter登录成功后无法跳转页面问题求助(附代码)
Flutter JWT登录后页面跳转失败排查与解决方案
常见问题排查与修复方案
1. 路由配置是否正确
确保目标页面已在MaterialApp的路由表中注册,或者跳转时使用了正确的路由方式:
MaterialApp( routes: { '/login': (context) => LoginPage(), '/home': (context) => HomePage(), // 必须注册目标页面路由 }, );
如果使用无命名路由,跳转代码需传入正确的页面实例:
Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage()));
2. 跳转逻辑是否在异步回调内执行
JWT登录是异步操作,跳转代码必须放在登录请求成功的回调里,避免逻辑提前触发:
// AuthController中的登录方法示例 Future<void> login(String email, String password) async { try { final response = await http.post( Uri.parse('你的登录接口地址'), body: {'email': email, 'password': password}, ); if (response.statusCode == 200) { // 解析并存储JWT Token final token = jsonDecode(response.body)['token']; await SharedPreferences.getInstance().then((prefs) { prefs.setString('token', token); }); // 登录成功后执行跳转 Navigator.pushReplacementNamed(context, '/home'); } } catch (e) { // 处理登录错误 } }
注意:如果AuthController无法直接获取context,可以通过GlobalKey<NavigatorState>或状态管理工具(如GetX、Provider)传递上下文或触发跳转事件。
3. 状态管理是否正确更新
如果用了状态管理工具,要确保登录成功后状态已更新,且跳转逻辑正确触发:
// GetX AuthController示例 class AuthController extends GetxController { RxBool isLoggedIn = false.obs; Future<void> login(String email, String password) async { // 登录请求逻辑... if (登录成功) { isLoggedIn.value = true; Get.offAllNamed('/home'); // 使用GetX自带的跳转方法更可靠 } } }
避免依赖状态监听触发跳转时,因监听逻辑遗漏导致跳转失败。
4. 路由守卫是否拦截了跳转
如果设置了路由守卫(如检查Token是否存在),需确认Token已正确存储,守卫逻辑无错误:
MaterialApp( onGenerateRoute: (settings) async { final prefs = await SharedPreferences.getInstance(); final token = prefs.getString('token'); if (settings.name == '/home' && token == null) { return MaterialPageRoute(builder: (context) => LoginPage()); } // 其他路由处理逻辑 }, );
排查小技巧:登录成功后立即打印Token,确认是否已正确写入本地存储。
针对你的代码的额外检查点
- 确认跳转代码是在登录请求成功且Token存储完成后执行的
- 检查跳转时使用的
context是否有效(未被页面销毁) - 优先使用
pushReplacementNamed或Get.offAllNamed这类替换路由的方法,避免用户返回登录页
内容的提问来源于stack exchange,提问作者Sitt Paing Minn
相关产品推荐
相关产品推荐

