Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有人能给我解释一下Builter类在Flatter中做什么吗?_Android_Ios_Flutter - Fatal编程技术网

Android 有人能给我解释一下Builter类在Flatter中做什么吗?

Android 有人能给我解释一下Builter类在Flatter中做什么吗?,android,ios,flutter,Android,Ios,Flutter,文档非常混乱和模糊。下面是它所说的: 建筑类 柏拉图式小部件,调用闭包以获取其子小部件 以下是我的问题: “柏拉图式”是什么意思 “结束”是什么意思 这门课的目的到底是什么 它基本上将构建小部件的函数转换为小部件 如果您需要传递一个小部件,但只有一个返回小部件的函数,您可以使用Builder小部件 bool bar; Widget createFooOrBarWidget() { if(bar) { return BarWidget(); } return FooWidg

文档非常混乱和模糊。下面是它所说的:

建筑类

柏拉图式小部件,调用闭包以获取其子小部件

以下是我的问题:

  • “柏拉图式”是什么意思
  • “结束”是什么意思
  • 这门课的目的到底是什么

  • 它基本上将构建小部件的函数转换为小部件

    如果您需要传递一个小部件,但只有一个返回小部件的函数,您可以使用
    Builder
    小部件

    bool bar;
    
    Widget createFooOrBarWidget() {
      if(bar) {
        return BarWidget();
      } 
      return FooWidget();
    }
    
    Widget build(BuildContext context) =>
      Container(child: Builder((context) => createFooOrBarWidget()));
    
    你也可以使用

    Widget build(BuildContext context) =>
      Container(child: createFooOrBarWidget());
    

    但前者延迟了Foo或Bar小部件的创建,直到实际调用了
    build

    在互联网上进行了长时间的深入研究之后,我收集了一些小片段,并将它们组合起来,对Builder类的功能进行了连贯而清晰的解释

    术语:

    根据官方颤振文件,建筑商类别定义为:

    柏拉图式小部件,调用闭包以获取其子小部件

    柏拉图的意思是最简单的事情。术语闭包只是lambda函数的另一个名称

    目的:

    这将是一个冗长的解释,但请容忍我:

    在颤振框架中,每个小部件都有一个build方法,该方法接受BuildContext参数:

    小部件构建( 构建上下文上下文 ) { …}

    我们必须记住,上下文对象由框架自动传递给小部件的构建函数。由于框架会自动处理这一问题,因此任何小部件都没有理由拥有需要接受上下文参数的构造函数或函数(除了构建

    因此,如果您试图将特定的上下文对象传递给子对象,您将无法这样做。不能调用build()并手动传递自己的上下文对象。我的意思是,您可以,但是您将调用构建函数两次:

  • 你的人工呼叫
  • 框架的自动调用
  • 那么,我们如何传递一个特定的上下文对象呢?这就是Builder类的用武之地。Builder类的目的只是构建和返回子窗口小部件。这与其他小部件有何不同?啊哈!生成器类允许您将特定的上下文对象向下传递给其子对象。Builder类基本上是您自己设置的构建函数

    为什么我需要传递一个特定的上下文对象?让我们看一个例子:

    假设我们想将一个新的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'),
                    ),
                  );
            }));
      }
    
    上面的代码不起作用。Scaffold.of(context)函数将找不到脚手架,因为:

  • 脚手架小部件尚未创建
  • 传递给构建函数的上下文对象引用父小部件,它不是脚手架小部件
  • 那么,我们如何让子SnackBar小部件访问父Scaffold小部件呢?我们使用Builder类传递Scaffold小部件的上下文:

    请记住,生成器类构造函数:

    生成器({Key Key,@required WidgetBuilder})

    通过将小部件的构建委托给通过其构造函数传递的回调函数来创建小部件

    因此,在代码中:

    new Builder(builder: (BuildContext context){ ... });
    
    我们提供了一个关闭:

  • 包含一个BuildContext参数
  • 基于传递的上下文生成并返回子小部件
  • 基本上,您提供了自己的构建函数。此闭包中的BuildContext参数是脚手架的上下文!巴布姆

    基本上就是这样。颤振文件根本没有对此进行透彻的解释。我觉得破译古代象形文字比破译颤振文件要容易得多

    我希望这能帮助那些正在学习颤振的单调旅程中的人


    总结:对于仍然难以理解这个概念的人,让我用更简洁的形式来解释。Builder函数只允许您获取并使用Builder小部件所在的小部件的上下文对象。在上面的示例中,它是newscaffold()小部件。记住,唯一可用的上下文对象是父小部件(Scaffold上方)的上下文对象,因为当前小部件(Scaffold)尚未创建。我希望这能帮助那些还在挠头的人。干杯

    简单定义请在您所指的文档中添加lik。嗨,冈特。这里是:还没有关于“柏拉图式”的答案吗?我发现了-()柏拉图式的小部件是“最简单的”嗯。。我想我有了。你能为我确认一个事实吗:每个小部件都有一个构建方法吗?是的,没有
    build
    就没有小部件。当(重新)构建视图时,颤振在每个小部件上调用
    build
    。好的。得到确认后,我将根据您的信息和23小时的研究,为自己的问题发布一个答案,以找到一个建筑类的清晰解释。给我几分钟时间,我把我的答案贴出来,看看我是否答对了。对不起,耽搁了。我张贴了我的答案。你能帮我再检查一遍吗?你能详细说明一下“但是前者会延迟Foo或Bar小部件的创建,直到实际调用build”吗?我喜欢这两个片段,想知道它们到底有什么不同。嗨,我想这句话可能不正确
    new Builder(builder: (BuildContext context){ ... });