Flutter:可重用的小部件和BuildContext

时间:2019-11-16 03:54:30

标签: flutter dart

在一个flutter应用程序中,假设我有一个包含多个小部件的小部件类(即,只有一个典型的单个长Widget build()类,其中有多个小部件)。然后将它们拆分为多个带有各自类的子窗口小部件:例如,

之前:

 class Parents extend StatelessWidget{
   Widget build(BuildContext context){
      //Parent
      return Column{
          children: <Widget>[
              //Child 1
              Container('something inside'),

              //Child 2
              Container('something inside'),

              //Child 3
              Container('something inside'),
              ...
          ]
      }
   }
 }

现在:

 class Parents extend StatelessWidget{
   Widget build(BuildContext context){
      //Parent
      return Column{
          children: <Widget>[
              //Child 1
              myContainer('first child'),

              //Child 2
              myContainer('first child'),

              //Child 3
              myContainer('first child'),

              ...
          ]
      }
   }
 }

 class myContainer extend StatelessWidget{
   Widget build(BuildContext context){
      //child reusable widget
      return Container{
        'something inside'
      }
   }
 }

我的问题是这个Widget build(BuildContext context)

在上面的示例中,我在父类中多次调用myContainer类。在我看来,这意味着build小部件被调用了四次(其中有一个父项,每个孩子3次)。

我的意思是,我在线上看到了很多建议使用上述方法的示例,但这真的是一种适当的方法吗?我可能还没有完全理解颤动,但是由于它是一个小部件树,仅将父级context传递给子级是否会更有效率(就性能而言)?如下所示:

class myContainer extend StatelessWidget{
  final BuildContext parentContext;

   Widget build(parentContext){
      //child reusable widget
      return Container{
        'something inside'
      }
   }
 }

这两种方法似乎都行得通,但想看看我的思维方式是否有效。我不完全了解Context的机制,因此请多加澄清!

谢谢大家!

1 个答案:

答案 0 :(得分:1)

来自docs

  

每个小部件都有自己的BuildContext,它将成为   由StatelessWidget.build或State.build函数返回的窗口小部件。   (同样,RenderObjectWidgets的任何子项的父项。)

     

尤其是,这意味着在构建方法中,   build方法的小部件的上下文与build不同   该build方法返回的窗口小部件的上下文。这可能导致   一些棘手的情况。例如,Theme.of(context)查找   给定构建上下文的最接近的封闭主题。如果是构建方法   对于小部件Q,其返回的小部件树中包含一个主题,并且   尝试使用Theme.of传递自己的上下文,该构建方法用于   Q将找不到该主题对象。相反,它将找到任何主题   是小部件Q的祖先。如果的子部分的构建上下文   需要返回的树,可以使用Builder小部件:   传递给Builder.builder回调的上下文将是   生成器本身。

因此,这基本上意味着BuildContext方法内的build()实际上是它的父方法。因此,他们无需显式传递它。