首页 文章

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

提问于
浏览
4

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

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

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

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

final authWidget = AuthenticatedWidget.of(context);

完全有可能我错过了如何正确实施IW的一些细微差别,但同样,它确实起作用,我也看到其他人提出同样的问题(即here在'Inherited Widgets' Headers 下) .

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

2 回答

  • 8

    因此,不能使用Scaffold或MaterialApp作为InheritedWidget的子级吗?

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

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

    我认为这更多地与你如何设置你的MaterialWidget有关,但我无法从你提供的代码片段中看出来 .

    如果你可以添加更多的上下文,我会看看我是否可以提供更多 .

  • 1

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

    MyInherited.of(context) 将基本上查看 current context 的父级,看看是否有 MyInherited 实例化 .

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

    =>没有 MyInherited 作为父母

    =>崩溃

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

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

    建造者的例子:

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

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

    解决方案很简单!把 MyInheritedWidget 放在上面或_inside MaterialApp .

    两个例子:

    以上材料:

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

    内部材料:

    new MaterialApp(
      builder: (context, child) {
        return MyInherited(child: child);
      },
    )
    

    InheritedWidget 需要访问 Navigator 以推送页面/对话框时,第二个示例很有用 . 比如登录等 .

相关问题