我需要构建一个小部件只是为了获取其位图。我不在乎屏幕上有小部件。
所以我的问题是:我可以以某种方式在不使用屏幕视图层次结构的情况下“在侧面”构建窗口小部件吗?
我没有找到方法。因此,如果不可能,我可以在屏幕上构建小部件,但实际上不显示它。我已经尝试过了,Visibility但这将使RenderObjectnull。有了Offstage它打电话时会失败toImage()的断言:Failed assertion: line 2752 pos 12: ‘!debugNeedsPaint’: is not true.
Visibility
RenderObject
Offstage
toImage()
Failed assertion: line 2752 pos 12: ‘!debugNeedsPaint’: is not true.
编辑:看起来这在Flutter的最新版本中中断了。不知道为什么,但是我想Flutter现在会在确定完全不可见叠加层时避免绘制。该方法仍然可以使用,但是需要与翻译结合才能将其移出屏幕:https : //gist.github.com/itsJoKr/ce5ec57bd6dedf74d1737c1f39481913
有人建议使用OverlayEntry,它看起来是最好的解决方案。
OverlayEntry
您可以将其OverlayEntry放置在当前屏幕下方,以使该屏幕不可见并随maintainState: true其构建。一个很大的优点是,由于它不与当前的窗口小部件树混合使用,因此易于实现。
maintainState: true
OverlayState overlayState = Overlay.of(context); OverlayEntry entry = OverlayEntry(builder: (context) { return RepaintBoundary(key: key, child: yourWidget,); // Using RepaintBoundary to get RenderObject and convert to image }, maintainState: true); overlayState.insert(entry); // doesn't work anymore // overlayState.rearrange([entry], above: entry); // Didn't find how to insert it at the bottom of current overlays, so this should rearrange it so that our entry is at the bottom