render static method

Future<Uint8List?> render(
  1. Widget widget, {
  2. Size size = const Size(320, 200),
  3. double pixelRatio = 3,
  4. BuildContext? context,
  5. TextDirection? textDirection,
  6. Duration settle = const Duration(milliseconds: 50),
})

Implementation

static Future<Uint8List?> render(
  Widget widget, {
  Size size = const Size(320, 200),
  double pixelRatio = 3,
  BuildContext? context,
  TextDirection? textDirection,
  Duration settle = const Duration(milliseconds: 50),
}) async {
  try {
    final ui.FlutterView view = WidgetsBinding.instance.platformDispatcher.views.first;
    final RenderRepaintBoundary boundary = RenderRepaintBoundary();
    final RenderView renderView = RenderView(
      view: view,
      child: RenderPositionedBox(child: boundary),
      configuration: ViewConfiguration(logicalConstraints: BoxConstraints.tight(size), physicalConstraints: BoxConstraints.tight(size * pixelRatio), devicePixelRatio: pixelRatio),
    );
    final PipelineOwner pipelineOwner = PipelineOwner()..rootNode = renderView;
    renderView.prepareInitialFrame();
    final BuildOwner buildOwner = BuildOwner(focusManager: FocusManager());
    Widget content = MediaQuery(
      data: MediaQueryData(size: size, devicePixelRatio: pixelRatio),
      child: Directionality(textDirection: textDirection ?? (context == null ? TextDirection.ltr : Directionality.of(context)), child: widget),
    );
    if (context != null) content = InheritedTheme.captureAll(context, content);
    final RenderObjectToWidgetElement<RenderBox> root = RenderObjectToWidgetAdapter<RenderBox>(container: boundary, child: content).attachToRenderTree(buildOwner);
    buildOwner.buildScope(root);
    if (settle > Duration.zero) {
      await Future<void>.delayed(settle);
      buildOwner.buildScope(root);
    }
    buildOwner.finalizeTree();
    pipelineOwner
      ..flushLayout()
      ..flushCompositingBits()
      ..flushPaint();
    final ui.Image image = await boundary.toImage(pixelRatio: pixelRatio);
    final ByteData? data = await image.toByteData(format: ui.ImageByteFormat.png);
    image.dispose();
    return data?.buffer.asUint8List();
  } catch (_) {
    return null;
  }
}