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

Flutter应用登录/注销后侧边栏失效,需重启才识别状态

问题解决:Flutter登录/注销后侧边栏失效,需重启才识别状态

核心问题分析

  • 初始_checkLoginStatus方法中更新isLoggedIn时未调用setState,导致UI无法感知状态变化
  • 未监听Firebase Auth的实时状态变更,登录/注销操作后无法同步更新本地状态
  • 登录/注销完成后,未主动更新SharedPreferences中的isLoggedIn状态并触发UI重建

具体修复步骤

1. 修复状态更新逻辑

修改_checkLoginStatus方法,确保更新状态时调用setState触发UI重建,同时直接依赖Firebase Auth的用户状态判断登录状态,比仅依赖SharedPreferences更可靠:

void _checkLoginStatus() async {
  final prefs = await SharedPreferences.getInstance();
  final user = FirebaseAuth.instance.currentUser;
  setState(() {
    isLoggedIn = user != null;
    _user = user;
  });
  await prefs.setBool('isLoggedIn', isLoggedIn);
}

2. 添加Firebase Auth状态监听

在initState中添加Auth状态监听,实时捕获登录/注销事件,自动同步状态:

@override
void initState() {
  super.initState();
  _checkLoginStatus();
  // 监听Auth状态变化,实时更新UI
  FirebaseAuth.instance.authStateChanges().listen((User? user) {
    setState(() {
      isLoggedIn = user != null;
      _user = user;
    });
    // 同步更新SharedPreferences
    SharedPreferences.getInstance().then((prefs) {
      prefs.setBool('isLoggedIn', isLoggedIn);
    });
  });
}

3. 优化页面跳转逻辑

在getScreen方法中增加登录状态判断,避免已登录状态下进入登录页面:

Widget getScreen(MenuItem currentItem, bool isLoggedIn, User? user) {
  switch (currentItem) {
    case MenuItems.about:
      return const About();
    case MenuItems.register:
      return const RegisterScreen();
    case MenuItems.chat:
      return const About();
    case MenuItems.login:
      // 已登录时直接返回首页
      return isLoggedIn ? Home(isLoggedIn: isLoggedIn, user: user) : const LoginScreen();
    default:
      return Home(isLoggedIn: isLoggedIn, user: user);
  }
}

4. 确保侧边栏响应状态变化

确认SidebarScreen内部使用传入的isLoggedIn状态调整UI(比如显示/隐藏登录/注销按钮),保证状态变化时侧边栏能同步更新。

完整修复后的核心代码片段

class _MyAppState extends State<MyApp> {
  late bool isLoggedIn = false;
  User? _user;
  final zoomDrawerController = ZoomDrawerController();
  MenuItem currentItem = MenuItems.home;

  @override
  void initState() {
    super.initState();
    _checkLoginStatus();
    // 监听Firebase Auth状态变化
    FirebaseAuth.instance.authStateChanges().listen((User? user) {
      setState(() {
        isLoggedIn = user != null;
        _user = user;
      });
      // 更新SharedPreferences
      SharedPreferences.getInstance().then((prefs) {
        prefs.setBool('isLoggedIn', isLoggedIn);
      });
    });
  }

  void _checkLoginStatus() async {
    final prefs = await SharedPreferences.getInstance();
    final user = FirebaseAuth.instance.currentUser;
    setState(() {
      isLoggedIn = user != null;
      _user = user;
    });
    await prefs.setBool('isLoggedIn', isLoggedIn);
  }

  @override
  Widget build(BuildContext context) {
    return ScreenUtilInit(
      child: Directionality(
        textDirection: TextDirection.ltr,
        child: Builder(builder: (context) {
          return ZoomDrawer(
            menuScreen: SidebarScreen(
              currentItem: currentItem,
              onSelectItem: (item) {
                setState(() => currentItem = item);
                ZoomDrawer.of(context)!.close();
              },
              isLoggedIn: isLoggedIn,
              zoomDrawerController: zoomDrawerController,
            ),
            showShadow: true,
            style: DrawerStyle.style1,
            controller: zoomDrawerController,
            slideHeight: MediaQuery.of(context).size.height,
            mainScreen: getScreen(currentItem, isLoggedIn, _user),
          );
        }),
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者Armando Sánchez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:15:56