【问题标题】:How does Flutter Widget rerender works when it's properties change?当 Flutter Widget 的属性发生变化时,它是如何重新渲染的?
【发布时间】:2020-04-29 06:59:17
【问题描述】:

我只是想知道当 Parent 小部件的属性发生变化时 Flutter Widget 是如何工作的。

假设我们有一个 Parent Widget,它根据一些可变值或一些可侦听值(如 Bloc 模式)呈现 Widget。

return Scaffold(
  body: BlocBuilder<LocationBloc, LocationState>(builder: (context, state) {
    if (state is NewLocationState) {
      return Map(
        location: LatLng(state.latitude, state.longitude),
      );
    }
    return Container();
  }),
);

所以在上面的代码中,NewLocationState 每 15 秒出现一次新值。

我的问题是:这个Map Widget 发生了什么?

Flutter 是否每 15 秒用新的 NewLocationState 或类似于 React 渲染一个全新的 Map Widget,Flutter 可以比较某种虚拟树中的更改,并且只更改现有 Map 中的属性,这是有效的并且应该会减少内存消耗。

Bloc 示例仅供参考/我的问题的上下文。但我想了解 Flutter Widget 在属性更改时的整体表现。

干杯

【问题讨论】:

标签: flutter dart widget flutter-bloc


【解决方案1】:

所以在上面的代码中,NewLocationState 每 15 秒带有新值。

Flutter 是否每 15 秒渲染一个全新的 Map Widget?

是的。小部件不会以任何方式重用。

另一方面,在重新创建小部件实例时,其关联的 StateElementRenderObjects 被保留(因为它们是可变的)。

由于 Flutter 应用程序中的所有工作都是由这三者完成的,因此它实际上非常高效。

【讨论】:

  • 谢谢,所以更好的做法应该是在没有状态断言的情况下实例化 Map Widget 并将 BlocProvider 移动到 Map 小部件中,否则没关系,因为这样我会在 NewLocationState 上调用 setState里面的 Widget 和 Widget 无论如何都会重新渲染?
  • 没关系。
  • @RémiRousselet 我有一个疑问。正如你所说,小部件没有被重用,所以当更新发生时,旧的小部件会发生什么。 Flutter 会处理它还是它仍然在内存中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2020-10-16
  • 2022-01-24
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 2017-05-06
相关资源
最近更新 更多