我尝试将列表项的子项(某处)渲染到树中的不同位置(小部件);在下面的方法中,BlendMask
“目标”小部件检查并绘制“源”小部件,这些小部件让它们自己GlobalKey
存储在blendKeys
. 这有点工作。而且我不太确定我是否会与框架抗争,或者只是遗漏了一些要点......
问题有两个:
次要问题:这种方法在调试器中效果不佳。它编译并运行良好,但每次热重载(保存 fe)都会引发“无法找到非活动元素的 RenderObject()”。也许我错过了一些调试标志?
真正的问题,这让我对这个想法提出质疑:如前所述,
Source
-Widget 位于 a 的子树的某个位置Scrollable
(来自fe):当列表滚动时,如何ListView.build
更新?-不访问列表scrollController?!我尝试通过s监听小部件的状态,但担心滚动没有更新。也许它只需要一个战略设置?*希望* :DÒffset
srcChild.paint()
WidgetsBindingObserver
didChangeMetrics
Source
RepaintBoundery
无论如何,每一个提示都非常感谢。顺便说一句,这是这个问题的延伸,它本身延伸了这个......
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