InheritedWidget with Scaffold as child 似乎无法正常工作

InheritedWidget with Scaffold as child doesn't seem to be working

我希望在我的 Flutter 应用程序的根级别使用 InheritedWidget 以确保经过身份验证的用户的详细信息可用于所有 child 小部件。本质上使脚手架成为 IW 的 child,如下所示:

@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 模式,但是当我 return 回到来自其他地方的主页 (MyHome),如下所示:

Navigator.popAndPushNamed(context, '/home');

这个 call-in MyHome 的构建方法(以前有效)然后导致 authWidget 为空:

final authWidget = AuthenticatedWidget.of(context);

完全有可能我遗漏了一些关于如何正确实施 IW 的细微差别,但同样,它最初确实有效,我也看到其他人提出了同样的问题(即 在 'Inherited Widgets' 下标题)。

因此无法使用 Scaffold 或 MaterialApp 作为 InheritedWidget 的 child 吗?或者这可能是一个要提出的错误?提前致谢!

Is it therefore not possible to use a Scaffold or a MaterialApp as the child of an InheritedWidget?

这样做是很有可能的。我之前一直在努力解决这个问题并发布了一些细节和示例代码 here.

您可能想让 App-level InheritedWidget 成为 MaterialApp 的父级而不是 Scaffold 小部件。

我认为这更多地与您设置 MaterialWidget 的方式有关,但我无法从您提供的代码片段中完全分辨出来。

如果您可以添加更多上下文,我会看看是否可以提供更多。

MyInherited.of(context) 基本上会查看 当前上下文 的 parent 以查看是否有 MyInherited 实例化。

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

=> 没有 MyInherited 作为 parent

=> 崩溃

诀窍是使用不同的上下文。 那里有很多解决方案。您可以在另一个小部件中实例化 MyInherited,这样您的构建方法的 context 就会有一个 MyInherited 作为 parent.

或者您可以使用 Builder 来引入一个假的小部件,它将向您传递它的上下文。

生成器示例:

return new MyInheritedWidget(
  child: new Builder(
    builder: (context) => new Scaffold(),
  ),
);

另外一个问题,出于同样的原因,如果你在路由内部插入一个inheritedWidget,它在外部将不可用这条路线。

这里的解决方法很简单! 把你的MyInheritedWidget放在MaterialApp.

上面

以上material:

new MyInherited(
  child: new MaterialApp(
    // ...
  ),
)