Flutter底部导航栏跳转异常:UserInfoScreen传参null问题排查
解决方案
1. 修复UserInfoScreen(user: null)报错问题
你的UserInfoScreen大概率未处理user == null的边界场景(比如直接执行user!.xxx这类强制解包操作),导致空指针异常。
修改底部导航栏的点击逻辑,先判断用户登录状态再加载对应页面:
void _onItemTapped(int index) async{ setState(() { _currrentIndex = index; switch(index){ case 0: _widgetBody = HomeScreen(); break; case 1: _widgetBody = SearchScreen(); break; case 2: _widgetBody = const Center(child: Text('favourite'),); break; case 3: // 未登录时跳转登录页,而非传null给UserInfoScreen if(user == null){ Navigator.push(context, MaterialPageRoute(builder: (ctx) => LoginScreen())); _currrentIndex = 0; _widgetBody = HomeScreen(); } else { _widgetBody = UserInfoScreen(user: user,); } break; } }); }
同时给UserInfoScreen添加空值兼容逻辑:
class UserInfoScreen extends StatelessWidget { final User? user; const UserInfoScreen({super.key, this.user}); @override Widget build(BuildContext context) { if(user == null){ return Center( child: ElevatedButton( onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (ctx) => LoginScreen())), child: const Text('请登录'), ), ); } // 已登录状态渲染用户信息 return Scaffold( body: Center(child: Text('欢迎 ${user!.name}')), ); } }
2. 修复WelcomePage跳转LoginScreen失效问题
跳转失效通常由状态管理未同步或路由逻辑错误导致,可按以下方向排查修复:
状态管理同步问题
如果user状态通过Provider、Riverpod等工具维护,确保LoginScreen登录成功后,正确更新全局user状态,让Wrapper感知到状态变化并重建页面。示例(Provider):
// 登录成功后更新状态 context.read<UserProvider>().setUser(loggedInUser);
路由逻辑优化
修改WelcomePage的跳转逻辑,等待登录结果并同步页面状态:
// WelcomePage中的跳转按钮 ElevatedButton( onPressed: () async { final loginResult = await Navigator.push(context, MaterialPageRoute(builder: (ctx) => LoginScreen())); if(loginResult == true){ setState(() {}); // 登录成功后直接切换到个人中心 _currrentIndex = 3; _widgetBody = UserInfoScreen(user: user,); } }, child: const Text('去登录'), )
同时在LoginScreen登录成功时返回结果:
// 登录成功后返回标记 Navigator.pop(context, true);
Wrapper逻辑修正
确保Wrapper正确监听user状态变化,示例:
class Wrapper extends StatelessWidget { const Wrapper({super.key}); @override Widget build(BuildContext context) { final user = context.watch<UserProvider>().user; // 无论登录状态,都返回带底部导航栏的页面,仅通过状态控制页面内容 return const MainBottomNavScreen(); } }
内容的提问来源于stack exchange,提问作者Irfan Tariq
相关产品推荐
相关产品推荐

