You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:25:17