captureAsUiImage static method

Future<String?> captureAsUiImage({
  1. double? pixelRatio = 1,
  2. required GlobalKey<State<StatefulWidget>> globalKey,
  3. Duration delay = const Duration(milliseconds: 40),
})

Implementation

static Future<String?> captureAsUiImage(
    {double? pixelRatio = 1,
    required GlobalKey globalKey,
    Duration delay = const Duration(milliseconds: 40)}) {
  return Future.delayed(delay, () async {
    try {
      var findRenderObject = globalKey.currentContext?.findRenderObject();
      if (findRenderObject == null) {
        return null;
      }
      RenderRepaintBoundary boundary =
          findRenderObject as RenderRepaintBoundary;
      BuildContext? context = globalKey.currentContext;
      if (pixelRatio == null) {
        if (context != null) {
          // ignore: use_build_context_synchronously
          pixelRatio = pixelRatio ?? MediaQuery.of(context).devicePixelRatio;
        }
      }
      ui.Image image = await boundary.toImage(pixelRatio: pixelRatio ?? 1);
      ByteData? byteData =
          await image.toByteData(format: ui.ImageByteFormat.png);
      image.dispose();

      Uint8List? pngBytes = byteData?.buffer.asUint8List();
      if (pngBytes != null) {
        final Directory cacheDir = await Directory.systemTemp.createTemp();
        final String filePath = path.join(cacheDir.path,
            'screenguard_${DateTime.now().millisecondsSinceEpoch}.png');

        final File file = File(filePath);
        await file.writeAsBytes(pngBytes);

        return filePath;
      }
      return null;
    } catch (e) {
      return null;
    }
  });
}