【问题标题】:Flutter: reusable widget and BuildContextFlutter:可重用的小部件和 BuildContext
【发布时间】:2020-03-12 05:16:29
【问题描述】:

在 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类3次。在我看来,这意味着 build 小部件被调用了四次(与父级调用一次,每个子级调用 3 次)。

我的意思是,我在网上看到一堆例子,推荐使用上述方法,但这真的是一种正确的方法吗?我可能还不完全理解颤动,但由于它是一个小部件树,所以将父级 context 简单地传递给子级会更有效(就性能而言)?如下:

class myContainer extend StatelessWidget{
  final BuildContext parentContext;

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

这两种方法似乎都有效,但我想看看我的思维方式是否偏离了方向。我不完全理解Context 的机制,任何澄清都将非常感谢!

谢谢大家!

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    来自docs

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

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

    所以,这基本上意味着build() 方法中的BuildContext 实际上是它的父方法。因此,它们不需要显式传递它。

    【讨论】:

    • 这非常有帮助!谢谢! =)
    猜你喜欢
    • 2019-08-26
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2022-11-24
    • 2022-12-09
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多