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(
// ...
),
)
我希望在我的 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 的细微差别,但同样,它最初确实有效,我也看到其他人提出了同样的问题(即
因此无法使用 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(
// ...
),
)