代码之家  ›  专栏  ›  技术社区  ›  Andrey

如何在flutter中强制重绘无状态小部件?

  •  0
  • Andrey  · 技术社区  · 3 年前

    我的代码如下:

    class MyApp extends StatelessWidget {
      var providers = [EmailAuthProvider()];
      @override
      Widget build(BuildContext context) {
        if (FirebaseAuth.instance.currentUser == null) { // content depends on external variable
          return SignInScreen(
            providers: providers,
          );
        } else {
          return ProfileScreen(
            providers: providers,
          );
        }
      }
    }
    

    问题是,小部件在执行操作后不会重新绘制自己:登录后,它仍然显示SignInScreen而不是ProfileScreen。

    我可以用有状态的小部件包装它,并用 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 方法,因为我的应用程序中不需要路由。我想补充一点 signIn 小部件在那里以简单的方式。

    0 回复  |  直到 3 年前