【问题标题】:Flutter: can a StatelessWidget return a StatefulWidget from its build method?Flutter:StatelessWidget 可以从其构建方法中返回 StatefulWidget 吗?
【发布时间】:2019-12-23 20:37:38
【问题描述】:

我想知道如果我定义了一个 StatelessWidget 但从它的 build 方法返回一个有状态的 Widget 会发生什么?我已经尝试过了,一切似乎都正常,但我只想知道幕后发生了什么,这样我就可以确定当我将它投入生产时不会有任何问题。具体来说:

1) 我想知道父 StatelessWidget 的每次重建是否都会触发它返回的 StatefulWidget 的重建?如果是这样,是不是说我实际上是在返回一个 StatelessWidget?

2) 我想知道父 StatelessWidget 是否仍会在小部件树中,因为它只是一个包装器并且没有任何要呈现的可视元素?

3)如果我想给子StatefulWidget一个Key,我应该给父StatelessWidget同样的key吗?或者,我应该将密钥放在父 StatelessWidget 上吗?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    混合无状态和有状态是一个非常、非常、非常常见的用例。

    答案相对简单:没有什么特别的事情发生。

    Stateless+Stateful 与 Stateless*2 或 Stateful*2 相同。没有行为改变,也不需要额外的代码。

    我想知道父 StatelessWidget 的每次重建是否都会触发它返回的 StatefulWidget 的重建?如果是这样,是不是说我实际上是在返回一个 StatelessWidget?

    没有。每个小部件都是独立的,可以在不强制其他小部件重建的情况下进行重建。

    子重建不会使父重建。同样,父母重建也不一定强制孩子重建。

    我想知道父 StatelessWidget 是否仍会在小部件树中,因为它只是一个包装器并且没有任何要呈现的可视元素?

    是的,StatelessWidget 仍在树中。

    不,它不仅仅是“一个包装器”。 StatelessWidget 可以使用 InheritedWidgets 并覆盖 ==

    这些可能会导致小部件独立于其他小部件进行重建。因此,这个小部件必须在树中显示。

    它甚至有一个 setState 等价物;它只是不公开。

    如果我想给子 StatefulWidget 一个 Key,我应该给父 StatelessWidget 相同的 key 吗?或者,我应该将密钥放在父 StatelessWidget 上吗?

    没有。那是不需要的。

    如果键在一个小部件上,这将影响它的整个子树。所以也没有必要把它放在后代身上。

    事实上,你不能,这取决于 Key。例如,GlobalKey 要求是唯一的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2011-09-27
      • 2011-12-10
      • 1970-01-01
      • 2012-06-22
      相关资源
      最近更新 更多