经过长时间在互联网上进行的大量令人费解的研究,我收集了一些小片段并将它们组合起来,对 Builder 类的作用进行了连贯而清晰的解释。
术语:
根据 flutter 官方文档,建造者等级定义为:
一个柏拉图式的小部件,它调用闭包来获取其子小部件。
Platonic指的是此类事物中最简单的事物。期限closure只是一个的另一个名字lambda功能。
Purpose:
这将是一个冗长的解释,但请跟我说:
在 Flutter 框架中,每个 widget 都有一个build方法接受一个构建上下文范围:
小部件构建(
BuildContext上下文
){
... }
我们必须记住,context对象被传递到小部件的build由框架自动运行。由于框架会自动处理这个问题,因此任何小部件都没有理由拥有构造函数或函数(除了build)需要接受context范围。
因此,如果您试图通过特定的context反对孩子,你就不能。您不能调用 build() 并传递您自己的context手动对象。我的意思是,你可以,但是你会调用构建函数两次:
- 您的手动呼叫。
- 由框架自动调用。
那么,我们如何才能通过一个特定的context目的?这就是Builder类进来了。目的Builder类只是构建并返回子部件。它与其他小部件有何不同?啊哈!这Builder课程允许您通过特定的context对象向下延伸至其子对象。这Builder类基本上是您自己设置的构建函数。
为什么我需要通过特定的context目的?让我们看一个例子:
假设我们要添加一个新的SnackBar小部件到新的Scaffold正在返回的父小部件:
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Container(),
/// Scaffold doesn't exist in this context here
/// because the context thats passed into 'build'
/// refers to the Widget 'above' this one in the tree,
/// and the Scaffold doesn't exist above this exact build method
///
/// This will throw an error:
/// 'Scaffold.of() called with a context that does not contain a Scaffold.'
floatingActionButton: new FloatingActionButton(onPressed: () {
Scaffold.of(context).showSnackBar(
new SnackBar(
content: new Text('SnackBar'),
),
);
}));
}
上面这段代码不起作用。这脚手架.of(上下文)函数将找不到Scaffold因为:
- The Scaffold小部件尚未创建。
- The context传递给构建函数的对象引用父窗口小部件,它不是Scaffold widget.
那么,我们如何让子 SnackBar 小部件访问父级Scaffold小部件?我们使用一个Builder类来传递上下文Scaffold widget:
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Container(),
/// Builders let you pass context
/// from your *current* build method
/// Directly to children returned in this build method
///
/// The 'builder' property accepts a callback
/// which can be treated exactly as a 'build' method on any
/// widget
floatingActionButton: new Builder(builder: (BuildContext context) {
return new FloatingActionButton(onPressed: () {
Scaffold.of(context).showSnackBar(
new SnackBar(
backgroundColor: Colors.blue,
content: new Text('SnackBar'),
),
);
});
}),
);
}
请记住,Builder类构造函数:
Builder({Key key, @required WidgetBuilder builder })
通过将其构建委托给通过其构造函数传递的回调函数来创建小部件。
所以,在代码中:
new Builder(builder: (BuildContext context){ ... });
我们提供了一个闭包:
- 包含一个BuildContext上下文范围
- 基于此构建并返回子小部件context passed.
基本上,您提供了自己的构建函数。这BuildContext上下文这个闭包中的参数是脚手架的上下文!噗!
基本上就是这样。 Flutter 文档根本没有对此提供详尽的解释。我觉得破译古代象形文字比破译 Flutter 文档更容易。
SUMMARY:对于仍然难以理解这个概念的人,让我以更简洁的形式解释一下。 Builder 功能仅允许您获取并使用context小部件的对象Builder在上面的例子中,它是新脚手架()小部件。请记住,唯一context可用的对象是父窗口小部件(脚手架上方)的对象,因为当前窗口小部件(脚手架)尚未创建。我希望这能帮助那些还在摸不着头脑的人。