Flutter BuildContext在颤振中做什么?
Flutter BuildContext在颤振中做什么?,flutter,Flutter,BuildContext做了什么,我们从中得到了什么信息 只是不清楚 在术语BuildContext的第9个实例中有一个例子,但不清楚它是如何使用的。这是一组更大的代码中的一部分,我很难理解什么是BuildContext 有人能用简单/非常基本的术语解释一下吗?BuildContext就像它的名字所暗示的那样,是构建特定小部件的上下文 如果您以前做过一些React,那么该上下文与React的上下文类似(但使用起来更流畅);还有一些奖金 一般来说,上下文有两个用例: 与父母互动(主要是获取/发布
BuildContext
做了什么,我们从中得到了什么信息
只是不清楚
在术语BuildContext
的第9个实例中有一个例子,但不清楚它是如何使用的。这是一组更大的代码中的一部分,我很难理解什么是BuildContext
有人能用简单/非常基本的术语解释一下吗?
BuildContext
就像它的名字所暗示的那样,是构建特定小部件的上下文
如果您以前做过一些React,那么该上下文与React的上下文类似(但使用起来更流畅);还有一些奖金
一般来说,上下文有两个用例:
- 与父母互动(主要是获取/发布数据)
- 在屏幕上渲染后,获取屏幕大小和位置
Navigator.of(context.pushNamed('myRoute')
注意这里的上下文。它将用于获取树中上面的NavigatorState
小部件的最近实例。然后对该实例调用方法pushNamed
很酷,但是我什么时候想用它 例如,当您希望向下传递数据而不必手动将数据分配给每个小部件的配置时,BuildContext非常有用;您将希望在任何地方访问它们。但你不想把它传递给每一个构造函数 您可以潜在地创建一个全局或单个;但是,当conf更改时,您的小部件将不会自动重建 在本例中,使用
InheritedWidget
。使用它,您可以潜在地编写以下内容:
class Configuration extends InheritedWidget {
final String myConf;
const Configuration({this.myConf, Widget child}): super(child: child);
@override
bool updateShouldNotify(Configuration oldWidget) {
return myConf != oldWidget.myConf;
}
}
然后,这样使用它:
void main() {
runApp(
new Configuration(
myConf: "Hello world",
child: new MaterialApp(
// usual stuff here
),
),
);
}
多亏了这一点,现在应用程序中的无处不在,您可以使用构建上下文
访问这些配置。通过做
final configuration = context.inheritFromWidgetOfExactType(Configuration);
更酷的是,所有调用inheritFromWidgetOfExactType(配置)
的小部件都会在配置更改时自动重建
很棒,对吧?
BuildContext
类只不过是对所有构建的小部件树结构中小部件位置的引用
每个flatter小部件都有一个参数为BuildContext
的@override build()
方法
class CartItemWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {.....
简单解释一下,BuildContext
是:
BuildContext
将成为直接子部件BuildContext
的父BuildContext
阅读本文,很明显,BuildContexts
是链接的,并且构成了一个BuildContexts
树(父子关系)
如果我们现在尝试在前面的图中说明BuildContext的概念,我们会得到(仍然是一个非常简化的视图),其中每个颜色代表一个BuildContext(MyApp one除外,它是不同的):
下面显示了与创建有状态小部件相关的操作/调用序列(的简化版本)
小部件的状态独立于参数,但每次参数改变时,它都会被重建。在这种情况下,需要使用
InheritedWidget
是一种特殊的小部件,它在子树的根位置定义上下文。它可以有效地将该上下文传递给该子树中的每个小部件。对于Flatter开发人员来说,访问模式看起来很熟悉:
class MyInheritedWidget extends InheritedWidget {
MyInheritedWidget({
Key key,
@required Widget child,
this.data,
}): super(key: key, child: child);
final data;
static MyInheritedWidget of(BuildContext context) {
return context.inheritFromWidgetOfExactType(MyInheritedWidget);
}
@override
bool updateShouldNotify(MyInheritedWidget oldWidget) => data != oldWidget.data;
}
(BuildContext上下文)的静态MyInheritedWidget方法允许所有子部件获取包含上下文的最近的MyInheritedWidget的实例
最后,updateShouldNotify
overrided方法用于告诉InheritedWidget
如果对数据应用修改,是否必须将通知传递给所有子widget(已注册/订阅的)
更多信息
什么是BuildContext对象/上下文
在了解BuildCotext之前,我们必须了解元素对象
什么是元素对象
(注意:作为一名颤振开发人员,我们从未使用过Element对象,但我们使用过一个类似Element对象的对象(称为BuildContext对象)
元素对象是当前小部件的构建位置
什么是“构建位置”?
BuildContext对象=不推荐的元素对象
(与原始元素对象相比,它包含更少的实例方法)
为什么框架不鼓励元素对象并将其传递给我们?
因为元素对象具有实例