flutter - 带有 Scaffold 的 InheritedWidget 似乎无法正常工作

标签 flutter dart scaffold

我希望在我的 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(
    // ...
  ),
)

关于flutter - 带有 Scaffold 的 InheritedWidget 似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49373774/

相关文章:

如果小部件具有 key ,则 Flutter 小部件测试 : find. byKey 不起作用: GlobalKey(debugLabel: "gridView")

Grails 脚手架显示的列数少于域

ruby-on-rails - 如果模型已经存在,如何仅为 Controller 和 View 制作脚手架?

dart - Flutter:Future Builder 获取多个数据

flutter - Flutter:如何在透明容器中添加阴影?

navigation - 实际导航的 Flutter Navigation Drawer

flutter - AnimatedContainer 调整高度时出现溢出警告

使用内置功能的DataTable排序进行 flutter

dart - 有没有办法找到对象的范围?

dart - Dart 编辑器关于最终字段的错误报告不一致