4

为了在谷歌地图google_maps_flutter上显示自定义小部件,我使用了一个非常方便的函数,它将任何Widget(包括包含图像的)转换为Image,然后我将其转换为Uint8List我需要的。它在 iOS 和 Android 上运行良好。

Future createImageFromWidget( Widget widget){
  final RenderRepaintBoundary repaintBoundary = RenderRepaintBoundary();
  final RenderView renderView = RenderView(
    child: RenderPositionedBox(alignment: Alignment.center, child: repaintBoundary),
    configuration: ViewConfiguration(size: const Size.square(300.0), devicePixelRatio: ui.window.devicePixelRatio),
    window: null,
  );

  final PipelineOwner pipelineOwner = PipelineOwner()..rootNode = renderView;
  renderView.prepareInitialFrame();

  final BuildOwner buildOwner = BuildOwner(focusManager: FocusManager());
  final RenderObjectToWidgetElement<RenderBox> rootElement = RenderObjectToWidgetAdapter<RenderBox>(
    container: repaintBoundary,
    child: Directionality(
      textDirection: TextDirection.ltr,
      child: IntrinsicHeight(child: IntrinsicWidth(child: widget)),
    ),
  ).attachToRenderTree(buildOwner);

  buildOwner..buildScope(rootElement)..finalizeTree();
  pipelineOwner..flushLayout()..flushCompositingBits()..flushPaint();

  return repaintBoundary.toImage(pixelRatio: ui.window.devicePixelRatio)
    .then((image) => image.toByteData(format: ui.ImageByteFormat.png))
    .then((byteData) => byteData.buffer.asUint8List());
}

但不幸的是,当我尝试在 Web 上使用此功能时,我收到以下错误:

不支持的操作:网络上不支持 toImage

现在 Flutter 支持Image.toByteDataPicture.toImage #20750,但我不知道如何在我的情况下使用它。

实际上问题是 - 如何重新制作这个功能,以便它也可以在 Web 上运行?

谢谢,我会很高兴有任何想法

4

2 回答 2

3

根据问题#42767中的评论,该repaintBoundary.toImage功能取决于尚未为 Web 实现的功能。 该问题目前也没有被优先考虑。Scene.toImage

于 2020-10-02T23:39:00.783 回答
2

--dart-define=FLUTTER_WEB_USE_SKIA如果你提出flutter build web论点,toImage() 就可以工作。

该方法在没有此参数的情况下在本地工作。

我在看到作物包文档后找到了这个解决方案,它也使用了 toImage()

编辑

我在通过 iPhone 访问应用程序时发现了一些问题,从小部件生成图像的工作正常,但是我在项目中的一些动画停止工作。

我发现了这个问题,我将仅使用该参数进行一些测试,--dart-define=FLUTTER_WEB_AUTO_DETECT=true以查看 Flutter web 是否可以在桌面、android 和 iOS 上正常工作。

编辑 2

在 MacO 上进行一些测试后,toImage() 方法也可以正常工作。

于 2021-02-05T16:01:00.157 回答