flutter - 在屏幕外构建小部件

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

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

我没有找到办法。因此,如果这不可能,我可以在屏幕上构建小部件,但实际上不显示它。 我试过 Visibility 但这会使 RenderObject 为空。使用 Offstage 在断言上调用 toImage() 时会失败:Failed assertion: line 2752 pos 12: '!debugNeedsPaint': is not true.

最佳答案

编辑:看起来这在最新版本的 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

https://stackoverflow.com/questions/57408315/

相关文章:

flutter - 如何在 flutter 中为下拉弹出窗口设置动态高度

flutter - 使用 FadeInImage Flutter 正确拟合图像

dart - Flutter - 创建值和名称数组

dart - ListView.builder 在 flutter 中逐项滚动

android-studio - Flutter Emulator 连接到服务协议(protocol

string - 如何在本地保存用户名并在每个页面 flutter 中显示

listview - ListView中如何维护widget的状态?

firebase - 持久化用户身份验证 Flutter Firebase

flutter - Hummingbird(现在是 Flutter for web)计划发布。我应该

dart - 如何在 Flutter 中清除 AnimatedList 中的所有项目