render static method
Future<Uint8List?>
render(
- Widget widget, {
- Size size = const Size(320, 200),
- double pixelRatio = 3,
- BuildContext? context,
- TextDirection? textDirection,
- 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;
}
}