无法使用原生代码在 V2 Flutter 中截屏,它在 V1 Flutter 中运行良好
Posted
技术标签:
【中文标题】无法使用原生代码在 V2 Flutter 中截屏,它在 V1 Flutter 中运行良好【英文标题】:Unable to take screenshot in V2 Flutter using native code, it was working well in V1 Flutter 【发布时间】:2020-09-13 05:41:35 【问题描述】:我们正在构建一个 SDK,它会在应用集成后对其进行截图。我们能够为 Native android、Native ios、Cordova、IONIC、React Native、Xamarin 平台截屏。但是无法在 V2 Flutter 中拍摄快照。代码在 V1 Flutter 之前运行良好。但是,当在 V2 Flutter 上执行相同的本机代码时,会返回应用程序的黑色屏幕截图。
这里的问题是,V1 的 FlutterView 使用名为 registrar.view() 的方法对第三方插件公开可用,在 V2 中,此视图现在不会暴露给任何插件! https://api.flutter.dev/javadoc/io/flutter/plugin/common/PluginRegistry.Registrar.html 使用 V1 的 FlutterView,我们能够使用 PixelCopy 捕获视图的屏幕截图,但我们无法获取 V2 的 FlutterView,我们也没有找到任何解决方案来捕获它。
我们尝试了以下方法,但没有成功。有人可以帮我吗?
-
试图从我们在 SDK 中传递的上下文中获取活动
初始化,我们从活动中获取视图并尝试绘制它,
正在捕获空白屏幕截图
尝试将 SDK Flutter 插件迁移到 V2 使用
https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration
试图遍历视图层次结构并使用 Activity 绘制视图
上下文,正在捕获空白屏幕截图
尝试绘制从
FlutterActivity.getWindow().getDecorView().getRootView(),空白
正在捕获屏幕截图。
【问题讨论】:
你解决了吗? 【参考方案1】:您可以查看其GitHub 上的Screenshoot package 代码是如何做到的。该软件包是 Flutter v2 的最新版本。
包使用:
通过GlobalKey
获取当前小部件的render object。 GlobalKey _containerKey = GlobalKey().currentContext?.findRenderObject();
然后它转换为RenderRepaintBoundary
。 RenderRepaintBoundary boundary = findRenderObject as RenderRepaintBoundary;
获取设备的像素比例。 pixelRatio = pixelRatio ?? MediaQuery.of(context).devicePixelRatio;
最后,它创建了图像。 ui.Image image = await boundary.toImage(pixelRatio: pixelRatio ?? 1);
查看下面的完整代码:
Future<ui.Image?> captureAsUiImage(
double? pixelRatio: 1,
Duration delay: const Duration(milliseconds: 20))
//Delay is required. See Issue https://github.com/flutter/flutter/issues/22308
return new Future.delayed(delay, () async
try
var findRenderObject =
this._containerKey.currentContext?.findRenderObject();
if (findRenderObject == null)
return null;
RenderRepaintBoundary boundary =
findRenderObject as RenderRepaintBoundary;
BuildContext? context = _containerKey.currentContext;
if (pixelRatio == null)
if (context != null)
pixelRatio = pixelRatio ?? MediaQuery.of(context).devicePixelRatio;
ui.Image image = await boundary.toImage(pixelRatio: pixelRatio ?? 1);
return image;
catch (Exception)
throw (Exception);
);
【讨论】:
以上是关于无法使用原生代码在 V2 Flutter 中截屏,它在 V1 Flutter 中运行良好的主要内容,如果未能解决你的问题,请参考以下文章