Flutter:可重用小部件和BuildContext

3
在Flutter应用中,假设我有一个包含多个widget的widget类(例如,只是一个典型的单一长Widget build()类,其中包含了多个widget)。然后这些widget被分成多个子widget,拥有它们自己的类。举个例子,先前的代码如下:
 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小部件被调用了四次(一次是父类,另外三次是每个孩子)。
我的意思是,我在网上看到很多示例都推荐使用以上方法,但这真的是一个正确的做法吗?我可能还没有完全理解flutter,但既然它是一个小部件树,将父context直接传递给子节点是否更高效(从性能方面考虑)呢?像下面这样:
class myContainer extend StatelessWidget{
  final BuildContext parentContext;

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

两种方法似乎都可以,但我想知道我的思路是否正确。我不完全理解Context的机制,非常感谢任何澄清!

感谢大家!

1个回答

3
文档 中可以了解到:
每个小部件都有其自己的BuildContext,它成为StatelessWidget.build 或 State.build 函数返回的小部件的父级。 (同样,在RenderObjectWidgets中的任何子级的父级也是如此。)
特别是这意味着,在build方法内部,build方法所属的小部件的BuildContext与由该build方法返回的小部件的BuildContext不同。 这可能会导致一些棘手的情况。例如,Theme.of(context)查找给定build context的最近封闭主题。 如果小部件Q的build方法包括在其返回的小部件树中的Theme,并试图使用传递自己的context的Theme.of,则Q的build方法将无法找到该Theme对象。 它将代替找到作为小部件Q祖先的任何主题。 如果需要返回树中子部分的BuildContext,则可以使用Builder小部件:传递给Builder.builder回调的BuildContext将是Builder本身的BuildContext。
因此,这基本上意味着,在build()方法内部的BuildContext实际上是其父级的BuildContext。因此,无需显式传递。

那真是太有帮助了!谢谢!=) - Steve Kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接