Визуализация изображения из виджета, содержащего другое изображение

#android #ios #flutter #dart

Вопрос:

Я пытаюсь отобразить изображение из виджета, содержащего другие изображения. Цель этого состоит в том, чтобы использовать эти сгенерированные изображения в качестве маркеров Google Maps.

В настоящее время я могу отображать изображение из виджета, но изображения(ресурсы) в этом виджете отсутствуют. Я заметил, что изображения в Flutter загружаются асинхронно, и у меня такое чувство, что такое поведение вызывает проблему — изображение виджета отображается до того, как активы успеют загрузиться. Однако я не смог решить эту проблему.

Код, который я использую для визуализации изображений:

 class WidgetToImage {

  static Future<ByteData?> generate(Widget widget) async {
    final RenderRepaintBoundary repaintBoundary = RenderRepaintBoundary();
    final RenderView renderView = RenderView(
      child: RenderPositionedBox(
        child: repaintBoundary,
        alignment: Alignment.center,
      ),
      configuration: ViewConfiguration(
        size: ui.window.physicalSize / ui.window.devicePixelRatio,
        devicePixelRatio: ui.window.devicePixelRatio,
      ),
      window: ui.window,
    );

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

    BuildOwner buildOwner = BuildOwner(focusManager: FocusManager());
    final rootElement = RenderObjectToWidgetAdapter<RenderBox>(
      container: repaintBoundary,
      child: Directionality(
        textDirection: TextDirection.ltr,
        child: Theme(
          data: Appearances.lightTheme,
          child: widget,
        ),
      ),
    ).attachToRenderTree(buildOwner);
    buildOwner.buildScope(rootElement);
    buildOwner.finalizeTree();

    pipelineOwner.flushLayout();
    pipelineOwner.flushCompositingBits();
    pipelineOwner.flushPaint();

    final image = await repaintBoundary.toImage(pixelRatio: ui.window.devicePixelRatio);
    return image.toByteData(format: ui.ImageByteFormat.png);
  }

}