首页 > 解决方案 > InheritedWidget 和导航

问题描述

我尝试在导航中使用inheritedWidget。当我做 :

 Navigator.push(
        context,
        
        MaterialPageRoute(
            builder: (context) =>CurrentUser(
                             user:state.currentUser,
                             child:BookSelection()),

            ));
  }

但是当我在 BookSelection 并进入另一个需要 currentUser 的 MaterialPageRoute 时,我的 CurrentUser.of(context).user 为空。我知道我不在同一个上下文中,但是有没有一种解决方案可以在 bookSelection 树下的所有 MaterialPageRoute 中使用 CurrentUser ?还是我必须为每个 MaterialPage 复制上面的代码才能拥有 currentUser ?可能还不清楚。我有一个需要 currentUser 对象的页面 A、B、C。所以我的想法是用 currentUser 创建一个 InheritedWidget。我编写了从 A 到 B 的代码。但是当我从 B 到 C 时,在 C 中 currentUser 为空。我是否必须在每个新 Page 再次创建 InheritedWidget ?谢谢。

标签: flutter

解决方案


有多种方法,这就是我通常的做法:

  • 创建屏幕时,添加一个需要提供用户对象的构造函数

    class TabScreen extends StatefulWidget {
      static const screenID = 'tab_screen';
      static bool showSpinner = false;
      TabScreen({this.user});
      final User user;
    
    @override
    _TabScreenState createState() => _TabScreenState();
    }
    
  • 在第一个屏幕上获取用户

    User loggedInUser;
    
    void getCurrentUser() async {
      try {
        final user = _auth.currentUser;
        if (user != null) {
          loggedInUser = user;
        }
      } catch (e) {
        print(e);
      }
    }
    
  • 当您重定向到需要用户的屏幕时,您可以执行此操作

     return Navigator.pushReplacement(
          context,
          PageRouteBuilder(
            pageBuilder: (_, __, ___) => TabScreen(user: loggedInUser),
          ),
        );
    

在此 TabScreen 之后,用户对象将可用。


推荐阅读