在屏幕外构建小部件

Gud*_*din 5 flutter

我需要构建一个小部件来获取它的位图。我不在乎屏幕上的小部件。

所以我的问题是:我可以在不使用屏幕视图层次结构的情况下以某种方式“在侧面”构建小部件吗?

我没有找到办法做到这一点。所以,如果这不可能,我可以在屏幕上构建小部件,但实际上不显示它。我试过了,Visibility但这会使RenderObjectnull 。有了Offstage它打电话时会失败toImage()的断言:Failed assertion: line 2752 pos 12: ‘!debugNeedsPaint’: is not true.

Gud*_*din 3

编辑:看起来这在最新版本的 Flutter 中出现了问题。不知道为什么,但我猜想 Flutter 现在会在确定覆盖层根本不可见时避免绘制。这个方法仍然可以使用,但是需要结合translate将其移出屏幕: https: //gist.github.com/itsJoKr/ce5ec57bd6dedf74d1737c1f39481913

有些人建议使用OverlayEntry,它看起来是最好的解决方案。

您可以将其放在OverlayEntry当前屏幕下方,使其不可见,并用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
Run Code Online (Sandbox Code Playgroud)