我希望在我的 Flutter 应用程序的根级别使用 InheritedWidget,以确保所有子小部件都可以使用经过身份验证的用户的详细信息。基本上让 Scaffold 成为 IW 的子节点,如下所示:
@override
Widget build(BuildContext context) {
return new AuthenticatedWidget(
user: _user,
child: new Scaffold(
appBar: new AppBar(
title: 'My App',
),
body: new MyHome(),
drawer: new MyDrawer(),
));
}
这在应用程序启动时按预期工作,因此在表面上 似乎 我已经在我的 AuthenticatedWidget 中正确实现了 InheritedWidget 模式,但是当我从其他地方返回主页 (MyHome) 时这个:
Navigator.popAndPushNamed(context, '/home');
这个调用 MyHome 的 build 方法(之前有效)然后导致 authWidget 为空:
final authWidget = AuthenticatedWidget.of(context);
完全有可能我错过了如何正确实现 IW 的一些细微差别,但同样,它最初确实有效,我也看到其他人提出了同样的问题(即 here 在“继承的小部件”标题下)。
因此不能使用 Scaffold 或 MaterialApp 作为 InheritedWidget 的子级吗?或者这可能是一个要提出的错误?提前致谢!
最佳答案
MyInherited.of(context)
基本上会查看 current context 的父级以查看是否有实例化的 MyInherited
。
问题是:您继承的小部件是在当前上下文中在中实例化的。
=> 没有 MyInherited
作为父项
=> 崩溃
诀窍是使用不同的上下文。
那里有很多解决方案。您可以在另一个小部件中实例化 MyInherited
,以便您的构建方法的 context
将有一个 MyInherited
作为父级。
或者您可能会使用 Builder
来引入一个假小部件,该小部件将向您传递它的上下文。
构建器示例:
return new MyInheritedWidget(
child: new Builder(
builder: (context) => new Scaffold(),
),
);
另一个问题,出于同样的原因,如果你在一个路由inside插入一个inheritedWidget,它在这个路由的outside将不可用。
这里的解决方案很简单!
把你的 MyInheritedWidget
above MaterialApp
.
以上 Material :
new MyInherited(
child: new MaterialApp(
// ...
),
)
https://stackoverflow.com/questions/49373774/
相关文章:
flutter - 无法访问 flutter.dev (Mac OS)
flutter - 如何将小部件动态添加到 Flutter 中的列?
dart - 使用 Navigator.popUntil 和没有固定名称的路由
dart - 如何将背景图像添加到 flutter 应用程序?
android - Flutter - Image.network 失败时的默认图像
android - Flutter - 使用正则表达式验证电话号码
image - Flutter:如何将 Canvas/CustomPainter 保存到图像文件中?