我正在使用 Flutter 为 Windows 制作软件。我已经完成了所有操作,现在正处于最后一步,我需要截取大小为 5000x5000 的 SizedBox 内容的屏幕截图并将其转换为 PNG。问题在于,即使在窗口边缘记录了溢出,屏幕截图始终是软件窗口的大小。我也需要记录窗口外内容的屏幕截图(显然没有溢出指示器)。而且我没有使用 Listview,这些是特定的固定小部件,其中包含从本地数据库接收的数据。
我的第一次尝试是使用屏幕截图包,但我遇到了窗口限制的问题。我尝试通过控制器捕获页面本身;还有“captureFromWidget”,在上一页上调用,并将整个页面视为“captureFromWidget”中的小部件。我想到的解决方案是将窗口大小调整为 5000x5000,对内容进行屏幕截图,然后将窗口缩小到正常大小。
为了调整大小,我使用了“desktop_window”包,不幸的是它只能将窗口大小调整为显示器的最大尺寸。因此,我尝试了不同的包“bitsdojo_window”,再次出现同样的问题,它调整的最大大小是我的显示器的大小,没有达到我需要的 5000x5000。
我还尝试使用两个 Scrollbar 包裹的两个 SingleChildScrollview(一个水平一个垂直)来包裹 5000x5000 的内容。它只能浏览内容,但受限于窗口大小,不能截图。
-
所以我尝试了Flutter自己的RenderRepaintBoundary,这基本上就是“截图”包的工作原理,但不幸的是,同样的问题,受到窗口大小的限制。
最终,我所有的尝试都导致屏幕截图仅限于窗口。有什么办法可以超越窗口限制进行截图吗?是否有一个小部件可以渲染并考虑在“屏幕截图”或“RenderRepaintBoundary”中注册 5000x5000?我尝试了 OverflowBox,但也不起作用。
-
我需要这个软件至少在1366x768的计算机上工作,所以我不能在窗口内进行屏幕截图限制,因为我需要捕获5000x5000,而不仅仅是1366x768。
我简直不敢相信,在被这个问题困扰了几天之后,我发现了解决方案,而且非常简单。我做了一些 Widget 顺序测试,发现 RenderRepaintBoundary 或 Screenshot 需要位于 SingleChildScrollView 内部,而不是像我所做的那样之前。只是。代码如下所示:
return Scaffold(
body: Scrollbar(
controller: vertical,
thumbVisibility: true,
trackVisibility: true,
child: Scrollbar(
controller: horizontal,
thumbVisibility: true,
trackVisibility: true,
notificationPredicate: (notif) => notif.depth == 1,
child: SingleChildScrollView(
controller: vertical,
scrollDirection: Axis.vertical,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: horizontal,
child: Screenshot(
controller: screenshotController,
child: SizedBox(...
我也要感谢pskink,虽然遗憾的是我之前没有看到他的回答,但解决方案也可以在那里找到!