flutter - 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 ?谢谢。
解决方案
有多种方法,这就是我通常的做法:
创建屏幕时,添加一个需要提供用户对象的构造函数
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 之后,用户对象将可用。
推荐阅读
- python - 有没有办法在opencv python中获得两个单独轮廓的边界矩形的4个坐标点?
- python - 在两个轴上绘制 matplotlib 中的误差线
- node.js - Jest/SuperTest Express 集成测试 - 发送后无法设置标题。(当您在多个测试中调用同一个端点时)
- javascript - 如何使用 JS 对 dygraph 中的日期进行降序排序?
- ios - 如何在一个部分中组合相同的日期对象?
- azure - Azure 应用服务未将 Gitlab 容器注册表配置作为私有存储库
- ajax - Magento 2.2 Ajax 在类别页面中第二次无法正常工作
- excel - SQLite3 ODBC 驱动程序 - Access / Excel 逗号而不是点
- android - JobIntentService 不适用于 Oreo 以下的 API (API <= 26)
- java - 侦听器从元素获取文本(如果存在)