提交 c27a4d6b authored 作者: Leonardo Rignanese's avatar Leonardo Rignanese

fix memory leak

上级 34ea076f
...@@ -3,6 +3,7 @@ library screenshot; ...@@ -3,6 +3,7 @@ library screenshot;
// import 'dart:io'; // import 'dart:io';
import 'dart:async'; import 'dart:async';
import 'dart:typed_data'; import 'dart:typed_data';
// import 'package:path_provider/path_provider.dart'; // import 'package:path_provider/path_provider.dart';
import 'dart:ui' as ui; import 'dart:ui' as ui;
...@@ -19,6 +20,7 @@ import 'src/platform_specific/file_manager/file_manager.dart'; ...@@ -19,6 +20,7 @@ import 'src/platform_specific/file_manager/file_manager.dart';
/// ///
class ScreenshotController { class ScreenshotController {
late GlobalKey _containerKey; late GlobalKey _containerKey;
ScreenshotController() { ScreenshotController() {
_containerKey = GlobalKey(); _containerKey = GlobalKey();
} }
...@@ -52,6 +54,8 @@ class ScreenshotController { ...@@ -52,6 +54,8 @@ class ScreenshotController {
); );
ByteData? byteData = ByteData? byteData =
await image?.toByteData(format: ui.ImageByteFormat.png); await image?.toByteData(format: ui.ImageByteFormat.png);
image?.dispose();
Uint8List? pngBytes = byteData?.buffer.asUint8List(); Uint8List? pngBytes = byteData?.buffer.asUint8List();
return pngBytes; return pngBytes;
...@@ -100,26 +104,25 @@ class ScreenshotController { ...@@ -100,26 +104,25 @@ class ScreenshotController {
double? pixelRatio, double? pixelRatio,
BuildContext? context, BuildContext? context,
Size? targetSize, Size? targetSize,
}) async { }) async {
ui.Image image = await widgetToUiImage(widget, ui.Image image = await widgetToUiImage(widget,
delay: delay, delay: delay,
pixelRatio: pixelRatio, pixelRatio: pixelRatio,
context: context, context: context,
targetSize: targetSize); targetSize: targetSize);
final ByteData? byteData = final ByteData? byteData =
await image.toByteData(format: ui.ImageByteFormat.png); await image.toByteData(format: ui.ImageByteFormat.png);
image.dispose();
return byteData!.buffer.asUint8List(); return byteData!.buffer.asUint8List();
} }
static Future<ui.Image> widgetToUiImage( static Future<ui.Image> widgetToUiImage(
Widget widget, { Widget widget, {
Duration delay: const Duration(seconds: 1), Duration delay: const Duration(seconds: 1),
double? pixelRatio, double? pixelRatio,
BuildContext? context, BuildContext? context,
Size? targetSize, Size? targetSize,
}) async { }) async {
/// ///
///Retry counter ///Retry counter
...@@ -136,18 +139,24 @@ class ScreenshotController { ...@@ -136,18 +139,24 @@ class ScreenshotController {
/// ///
child = InheritedTheme.captureAll( child = InheritedTheme.captureAll(
context, context,
MediaQuery(data: MediaQuery.of(context), child: Material(child:child,color: Colors.transparent, )), MediaQuery(
data: MediaQuery.of(context),
child: Material(
child: child,
color: Colors.transparent,
)),
); );
} }
final RenderRepaintBoundary repaintBoundary = RenderRepaintBoundary(); final RenderRepaintBoundary repaintBoundary = RenderRepaintBoundary();
Size logicalSize = targetSize ?? Size logicalSize = targetSize ??
ui.window.physicalSize / ui.window.devicePixelRatio; // Adapted ui.window.physicalSize / ui.window.devicePixelRatio; // Adapted
Size imageSize = targetSize ?? ui.window.physicalSize; // Adapted Size imageSize = targetSize ?? ui.window.physicalSize; // Adapted
assert(logicalSize.aspectRatio.toStringAsPrecision(5) == assert(logicalSize.aspectRatio.toStringAsPrecision(5) ==
imageSize.aspectRatio.toStringAsPrecision(5)); // Adapted (toPrecision was not available) imageSize.aspectRatio
.toStringAsPrecision(5)); // Adapted (toPrecision was not available)
final RenderView renderView = RenderView( final RenderView renderView = RenderView(
window: ui.window, window: ui.window,
...@@ -238,14 +247,14 @@ class ScreenshotController { ...@@ -238,14 +247,14 @@ class ScreenshotController {
} while (isDirty && retryCounter >= 0); } while (isDirty && retryCounter >= 0);
return image; // Adapted to directly return the image and not the Uint8List
return image; // Adapted to directly return the image and not the Uint8List
} }
} }
class Screenshot<T> extends StatefulWidget { class Screenshot<T> extends StatefulWidget {
final Widget? child; final Widget? child;
final ScreenshotController controller; final ScreenshotController controller;
const Screenshot({ const Screenshot({
Key? key, Key? key,
required this.child, required this.child,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论