使用Scaffold作为子项的InheritedWidget似乎不起作用

KBD*_*ums 5 flutter

我希望在我的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(),
    ));
}
Run Code Online (Sandbox Code Playgroud)

这在app开始时按预期工作,所以表面看来我在AuthenticatedWidget中正确实现了InheritedWidget模式,但是当我从其他地方返回主页(MyHome)时:

Navigator.popAndPushNamed(context, '/home');
Run Code Online (Sandbox Code Playgroud)

在MyHome的构建方法中调用(之前有效)然后导致authWidget为null:

final authWidget = AuthenticatedWidget.of(context);
Run Code Online (Sandbox Code Playgroud)

完全有可能我缺少的是如何正确实现IW一些细微但同样,它最初做的工作,我也看到其他人提出同样的问题(即在此 "窗口小部件继承"标题下).

因此,不能使用Scaffold或MaterialApp作为InheritedWidget的子级吗?或者这可能是一个提出的错误?提前致谢!

Rém*_*let 14

这是许多人在开始颤抖时难以理解的问题.

MyInherited.of(context)将基本上查看当前上下文的父级,以查看是否有MyInherited实例化.

问题是:您继承的窗口小部件当前上下文中实例化.

=>不是MyInherited父母

=>崩溃

诀窍是使用不同的上下文.那里有很多解决方案.您可以MyInherited在另一个窗口小部件中实例化,以便context您的构建方法将具有MyInherited父级.

或者你可能会使用a Builder来引入一个虚假的小部件,它将传递给你它的上下文.

建造者的例子:

return new MyInheritedWidget(
  child: new Builder(
    builder: (context) => new Scaffold(),
  ),
);
Run Code Online (Sandbox Code Playgroud)

出于同样的原因,另一个问题是,如果路由中插入inheritedWidget ,它将不在此路由之外.

解决方案很简单!把你的MyInheritedWidget 上面 MaterialApp.

以上材料:

new MyInherited(
  child: new MaterialApp(
    // ...
  ),
)
Run Code Online (Sandbox Code Playgroud)