带有Scaffold作为孩子的InheritedWidget似乎并没有起作用

时间:2018-03-19 23:01:19

标签: 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(),
    ));
}

这在应用程序启动时按预期工作,所以表面似乎我已经在AuthenticatedWidget中正确实现了InheritedWidget模式,但是当我从其他地方返回到主页(MyHome)时这样:

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

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

final authWidget = AuthenticatedWidget.of(context);

我完全可能错过了如何正确实施IW的一些细微差别,但同样,它最初确实有效,我也看到其他人提出同样的问题(即here下的“继承小工具” #39;标题)。

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

2 个答案:

答案 0 :(得分:11)

这是许多人在开始挣扎时难以理解的问题。

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

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

=>没有MyInherited作为父级

=>碰撞

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

或者你可能会使用Builder来引入一个虚假的小部件来传递你的上下文。

建造者的例子:

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

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

解决方案很简单! 将您的MyInheritedWidget 置于 MaterialApp之上。

以上材料:

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

答案 1 :(得分:1)

  

因此不能使用脚手架或MaterialApp作为   InheritedWidget的子项?

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

您可能希望将App-level InheritedWidget作为MaterialApp的父级而不是Scaffold小部件。

我认为这更多地与您设置MaterialWidget的方式有关,但我不能从您提供的代码片段中说出来。

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