我希望在Flutter应用程序的根级别使用InheritedWidget,以确保所有子窗口小部件都可以使用经过身份验证的用户的详细信息。本质上,使脚手架成为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的构建方法(该方法以前有效)中进行此调用,导致authWidget为null:
final authWidget = AuthenticatedWidget.of(context);
完全有可能我遗漏了如何正确实现IW的细微差别,但是再次,它确实可以正常工作,并且我还看到其他人提出了相同的问题(即,在“继承的小部件”标题下)。
因此,是否不可能将Scaffold或MaterialApp用作InheritedWidget的子代?还是这可能是要引起的错误?提前致谢!
MyInherited.of(context)基本上将查看 当前上下文 的父级,以查看是否有MyInherited实例化。
MyInherited.of(context)
MyInherited
问题是:您继承的窗口小部件 在 当前上下文中实例化。
=>没有MyInherited父母
=>崩溃
诀窍是使用不同的 上下文 。那里有很多解决方案。您可以MyInherited在另一个小部件中实例化,以便context您的build方法的MyInherited父对象为a 。
context
或者,您可能会潜在地使用Builder来引入一个伪造的小部件,该小部件将向您传递其上下文。
Builder
建造者的例子:
return new MyInheritedWidget( child: new Builder( builder: (context) => new Scaffold(), ), );
出于同样的原因,另一个问题是,如果您 在 路由中插入一个InheritedWidget ,它将 在 该路由 之外 不可用。
解决方案在这里很简单!把你放在MyInheritedWidget 上面 MaterialApp。
MyInheritedWidget
MaterialApp
以上材料:
new MyInherited( child: new MaterialApp( // ... ), )