0

我尝试将列表项的子项(某处)渲染到树中的不同位置(小部件);在下面的方法中,BlendMask“目标”小部件检查并绘制“源”小部件,这些小部件让它们自己GlobalKey存储在blendKeys. 这有点工作。而且我不太确定我是否会与框架抗争,或者只是遗漏了一些要点......

问题有两个:

  • 次要问题:这种方法在调试器中效果不佳。它编译并运行良好,但每次热重载(保存 fe)都会引发“无法找到非活动元素的 RenderObject()”。也许我错过了一些调试标志?

  • 真正的问题,这让我对这个想法提出质疑:如前所述,Source-Widget 位于 a 的子树的某个位置Scrollable(来自fe):当列表滚动时,如何ListView.build更新?-不访问列表scrollController?!我尝试通过s监听小部件的状态,但担心滚动没有更新。也许它只需要一个战略设置?*希望* :DÒffsetsrcChild.paint()WidgetsBindingObserverdidChangeMetricsSourceRepaintBoundery

无论如何,每一个提示都非常感谢。顺便说一句,这是这个问题的延伸,它本身延伸了这个......

class BlendMask extends SingleChildRenderObjectWidget {
  [...]
  @override
  RenderObject createRenderObject(context) {
    return RenderBlendMask();
  }
}

class RenderBlendMask extends RenderProxyBox {
[...]
@override
void paint(PaintingContext context, offset) {    <-- the target where we want to render a widget
  [...]                                              from somewhere else in the tree!
  for (GlobalKey key in blendKeys) {
    if (key.currentContext != null) {
      RenderObject? srcChild                     <-- the source we want to render in this sibling widget!
       = key.currentContext!.findRenderObject();
      if (srcChild != null) {
        Matrix4 mOffset = srcChild.getTransformTo(null);
        context.pushTransform(true, offset, mOffset, (context, offset) {
          srcChild.paint(context, offset);
        });
      }
    } 
  }
}
} //RenderBlendMask
4

0 回答 0