openkraken / kraken

A web standards-compliant, high-performance rendering engine based on Flutter.
https://openkraken.com
Apache License 2.0
4.93k stars 304 forks source link

重构 RenderStyle,保证其 setter 中不直接操作 RenderObject #1394

Closed temper357 closed 2 years ago

temper357 commented 2 years ago

问题:

目前 RenderStyle 的 setter 中有一些场景会直接操作 RenderObject,例如设置 overflow: scroll 时会创建两层 RepaintBoundary,并且创建 scrollListener 关联到 renderBoxModel 上。在 RenderObject 需要 detach 与 attach 但是 element 不销毁的场景如 Sliver 会存在状态不同步现象:

  1. 由于创建 renderer 时并没有执行 renderStyle setter 中的 RenderObject 创建工作,导致 overflow: scroll 的容器并不会创建 RepaintBoundary。
  2. RenderBoxModel 重新创建 后由于 renderStyle 没有重新创建,导致 setter 中 scrollListener 没有关联到新的 RenderBoxModel。

重构方案:

  1. 将 RenderStyle 的 setter 中操作 RenderObject 的操作移到 element 上,setter 中通过事件机制通信。同时在 create renderer 的逻辑中加上根据不同 style 创建 RenderObject 的操作。
  2. 将 KrakenScrollable 从 renderBoxModel 移到 element 上。