0

我正在构建一个自定义RenderObject以在不同位置绘制子小部件的多个部分并进行不同的剪辑(布局、命中测试、语义和其他 RenderObject 方面在这里不相关)。我设法让它工作,但是更复杂的后代的代码中断(例如,FlutterLogo()工作但Scaffold()不是) - 孩子只在第一次(或最后一次)paintChild调用时被绘制。

我已经阅读RenderObject了文档并且没有发现任何会禁止在单个绘画阶段多次绘画孩子的东西。另一方面,我还没有找到任何可以做到这一点的 RenderObjects。paint我怀疑当孩子创建自己的图层并且该图层在调用之间重用时,这将不起作用。包裹任何东西似乎足以打破它childRepaintBoundary

class RenderExample extends RenderProxyBox {

  final _clipLayerHandles = [for (int i = 0; i < _gameChildCount; i++) LayerHandle<ClipRectLayer>()];

  //...

  @override
  bool get isRepaintBoundary => true;

  @override
  void dispose() {
    for (final handle in _clipLayerHandles) {
      handle.layer?.dispose();
    }
    super.dispose();
  }

  @override
  void paint(PaintingContext context, Offset offset) {
    for (...) {
      _clipLayerHandles[childIndex].layer = context.pushClipRect(
        needsCompositing,
        offset,
        parentRect,
        (context, offset) => context.paintChild(child!, offset + parentOffset - childOffset),
        oldLayer: _clipLayerHandles[childIndex].layer,
      );
    }
  }
}

你有什么见解吗?这在引擎中是不可能的吗?如果是这样,为什么?有什么技巧可以让它工作吗?

4

0 回答 0