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

Flutter中如何强制重绘无状态Widget?登录状态切换场景

Flutter 登录状态变更后Widget不重绘的简化实现方案

我写了一个无状态Widget,用来根据Firebase Auth的用户状态切换登录页和个人资料页:

class MyApp extends StatelessWidget {
  var providers = [EmailAuthProvider()];
  @override
  Widget build(BuildContext context) {
    if (FirebaseAuth.instance.currentUser == null) { // 内容依赖外部状态变量
      return SignInScreen(
        providers: providers,
      );
    } else {
      return ProfileScreen(
        providers: providers,
      );
    }
  }
}

但遇到一个问题:完成登录操作后,Widget不会自动重绘,仍然停留在SignInScreen,不会切换到ProfileScreen。

我目前的解决方法是把组件改成有状态Widget,通过setState()强制触发重绘:

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var providers = [EmailAuthProvider()];
  @override
  Widget build(BuildContext context) {
    if (FirebaseAuth.instance.currentUser == null) {
      return SignInScreen(
        providers: providers,
        actions: [
          AuthStateChangeAction<SignedIn>((context, state) {
            setState(() {});
          }),
          AuthStateChangeAction<UserCreated>((context, state) {
            setState(() {});
          }),
        ],
      );
    } else {
      return ProfileScreen(
        providers: providers,
        actions: [
          SignedOutAction((context) {
            setState(() {});
          }),
        ],
      );
    }
  }
}

想问一下有没有更简便的实现方式?另外我不想用go_route这类路由方案,因为我的应用不需要路由,只想用最简单的方式集成登录组件。


内容的提问来源于stack exchange,提问作者Andrey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:43:14