Skip to content

Instantly share code, notes, and snippets.

@leeprobert
Created June 19, 2021 08:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leeprobert/dbc4316217010bf6c994574c57337365 to your computer and use it in GitHub Desktop.
Save leeprobert/dbc4316217010bf6c994574c57337365 to your computer and use it in GitHub Desktop.
/**
This is a Widget extension that will automatically export an image of the widget when it is painted onscreen.
We was using this to create symbols for MapBox from Widgets that are generated programmatically.
*/
import 'dart:typed_data';
import 'dart:ui';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
class ImageGrabber extends SingleChildRenderObjectWidget {
final Function(ByteData) onImageGrab;
ImageGrabber({Key key, @required Widget child, @required this.onImageGrab})
: super(key: key, child: child);
@override
RenderImageGrab createRenderObject(BuildContext context) =>
RenderImageGrab(onImageGrab);
// TODO implement @override updateRenderObject ???
}
class RenderImageGrab extends RenderProxyBox {
final Function(ByteData) onImageGrab;
bool imageGrabbed;
RenderImageGrab(this.onImageGrab);
@override
bool get isRepaintBoundary => true;
@override
void paint(PaintingContext context, Offset offset) {
print('=========== paint $size ===========');
super.paint(context, offset);
imageGrabbed ??= grabImage();
}
bool grabImage() {
(layer as OffsetLayer)
.toImage(Offset.zero & size)
.then((image) => image.toByteData(format: ImageByteFormat.png))
.then(onImageGrab);
return true;
}
}
/**
USAGE:
*/
child: ImageGrab(
child: SomeWidgetToGrab(),
onImageGrab: (data) => print('png image length: ${data.lengthInBytes}'),
),
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment