我需要构建一个小部件来获取它的位图。我不在乎小部件是否在屏幕上。
所以我的问题是:我可以在不使用屏幕 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 - ListView.builder 在 flutter 中逐项滚动
android-studio - Flutter Emulator 连接到服务协议(protocol
string - 如何在本地保存用户名并在每个页面 flutter 中显示
listview - ListView中如何维护widget的状态?
firebase - 持久化用户身份验证 Flutter Firebase