Created
June 19, 2021 08:14
-
-
Save leeprobert/dbc4316217010bf6c994574c57337365 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
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