有一些InheritedWidget
我不明白的困惑。
我已经搜索并阅读了一些关于 stackoverflow 的 QA InheritedWidget
,但仍有一些我不明白的地方。
首先,让我们创建一个场景。
这是我的InheritedWidget
:
class MyInheritedWidget extends InheritedWidget {
final String name;
MyInheritedWidget({
@required this.name,
@required Widget child,
Key key,
}) : super(key: key, child: child);
@override
bool updateShouldNotify(MyInheritedWidget oldWidget) =>
oldWidget.name != this.name;
static MyInheritedWidget of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
}
}
这就是MyHomePage
包含MyInheritedWidget
. MyInheritedWidget
有两个孩子:WidgetA
和一个导航到另一个屏幕的按钮,在这种情况下Page1
。
class MyHomePage extends StatefulWidget {
@override
State createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
),
body: Center(
child: MyInheritedWidget(
name: 'Name',
child: Column(
children: [
WidgetA(),
TextButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => Page1(),
),
);
},
child: Text('Go to page 1'),
)
],
),
),
),
);
}
}
里面WidgetA
有一个文本小部件,显示来自的名称字段MyInheritedWidget
和导航到的另一个按钮Page2
。
class WidgetA extends StatefulWidget {
@override
_WidgetAState createState() => _WidgetAState();
}
class _WidgetAState extends State<WidgetA> {
@override
Widget build(BuildContext context) {
final myInheritedWidget = MyInheritedWidget.of(context);
return Column(
children: [
Text(myInheritedWidget.name),
TextButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => Page2(),
),
);
},
child: Text('Go to page 2'),
)
],
);
}
}
Page1
每个都只有一个文本小部件,Page2
显示来自.MyInheritedWidget
class Page1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
final myInheritedWidget = MyInheritedWidget.of(context);
return Scaffold(
appBar: AppBar(
title: Text('Page 1'),
),
body: Text(myInheritedWidget.name),
);
}
}
class Page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
final myInheritedWidget = MyInheritedWidget.of(context);
return Scaffold(
appBar: AppBar(
title: Text('Page 2'),
),
body: Text(myInheritedWidget.name),
);
}
}
在这种情况下,name字段MyInheritedWidget
是不可访问的 formPage1
和Page2
,但可以在 中访问WidgetA
。
现在让我们来看看这个问题:
据说InheritedWidget
可以从它的所有后代访问。子孙是什么意思?
在MyHomePage
,我知道WidgetA
是一个后裔MyInheritedWidget
。但是,Page1
也是?的后裔MyInheritedWidget
?
如果答案是否定的,我怎样才能成为Page1
的后代MyInheritedWidget
?
我需要再把它包在里面MyInheritedWidget
吗?
如果有这样的导航链怎么办:Page1 -> Page2 -> Page3 ... Page10并且我想MyInheritedWidget
在Page10中访问,我必须将每个页面都包装在里面MyInheritedWidget
吗?