import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:fis_measure/interfaces/process/items/item_feature.dart'; import 'package:fis_measure/interfaces/process/workspace/application.dart'; import 'package:fis_measure/process/workspace/measure_data_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; import 'measure_result.dart'; class MeasureImageCapturer { bool state = false; MeasureImageCapturer( this.globalKey, this.application, this.dataController, { this.onImageSaveBefore, this.onImageSavedAfter, this.onImageSaveDuring, }); final GlobalKey globalKey; final IApplication application; final IMeasureDataController dataController; final VoidCallback? onImageSaveBefore; final VoidCallback? onImageSavedAfter; final VoidCallback? onImageSaveDuring; /// 保存图片 void saveImage() async { if (state) return; state = true; onImageSaveBefore?.call(); final features = []; for (var item in application.measureItems) { if (item.measuredFeatures.isNotEmpty) { features.addAll(item.measuredFeatures); } if (item.feature != null) { features.add(item.feature!); } } MeasureResult measureResult = MeasureResult( measureApplicationName: application.applicationName, features: features, ); await Future.delayed(const Duration(milliseconds: 10), () async { final RenderRepaintBoundary? boundary = globalKey.currentContext ?.findRenderObject() as RenderRepaintBoundary?; if (boundary != null) { final image = await boundary.toImage(); final byteData = await image.toByteData(format: ui.ImageByteFormat.png); final pngBytes = byteData!.buffer.asUint8List(); Get.dialog( CaptureImage( bytes: pngBytes, ), transitionCurve: Curves.bounceInOut, ); // await (dataController as MeasureDataController).saveImage.call( // pngBytes, // dataController.measureImageData.patientCode ?? '', // dataController.measureImageData.recordCode ?? '', // dataController.measureImageData.remedicalCode ?? '', // measureResult.toDisplay(), // ); state = false; onImageSavedAfter?.call(); } }); } } class CaptureImage extends StatelessWidget { final Uint8List bytes; const CaptureImage({ Key? key, required this.bytes, }) : super(key: key); @override Widget build(BuildContext context) { return SimpleDialog( children: [Image.memory(bytes)], titlePadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero, backgroundColor: Colors.transparent, elevation: 4, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all( Radius.circular( 4, ), ), ), ); } }