|
@@ -11,7 +11,6 @@ import 'package:fis_measure/process/workspace/measure_controller.dart';
|
|
import 'package:fis_measure/process/workspace/measure_data_controller.dart';
|
|
import 'package:fis_measure/process/workspace/measure_data_controller.dart';
|
|
import 'package:fis_measure/process/workspace/measure_handler.dart';
|
|
import 'package:fis_measure/process/workspace/measure_handler.dart';
|
|
import 'package:fis_measure/process/workspace/measure_3d_view_controller.dart';
|
|
import 'package:fis_measure/process/workspace/measure_3d_view_controller.dart';
|
|
-import 'package:fis_measure/view/cursor.dart';
|
|
|
|
import 'package:fis_measure/view/gesture/positioned_cursor.dart';
|
|
import 'package:fis_measure/view/gesture/positioned_cursor.dart';
|
|
import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_style.dart';
|
|
import 'package:fis_measure/view/measure/measure_config/widgets/measure_configuration_style.dart';
|
|
import 'package:fis_measure/view/measure/measure_images_bar.dart';
|
|
import 'package:fis_measure/view/measure/measure_images_bar.dart';
|
|
@@ -49,6 +48,13 @@ class MeasureMainPage extends StatefulWidget implements FWidget {
|
|
}
|
|
}
|
|
|
|
|
|
class _MeasureMainPageState extends State<MeasureMainPage> {
|
|
class _MeasureMainPageState extends State<MeasureMainPage> {
|
|
|
|
+ /// 病人及图像信息
|
|
|
|
+ String _curToken = '';
|
|
|
|
+ String _curPatientCode = '';
|
|
|
|
+ String _curRemedicalCode = '';
|
|
|
|
+ String _curRecordCode = '';
|
|
|
|
+ bool? _curNeedRouterBack;
|
|
|
|
+
|
|
/// 数据
|
|
/// 数据
|
|
final measureData = Get.find<MeasureDataController>();
|
|
final measureData = Get.find<MeasureDataController>();
|
|
|
|
|
|
@@ -58,156 +64,119 @@ class _MeasureMainPageState extends State<MeasureMainPage> {
|
|
/// 测量项控制器
|
|
/// 测量项控制器
|
|
final measureMetaController = Get.put(MeasureMetaController());
|
|
final measureMetaController = Get.put(MeasureMetaController());
|
|
|
|
|
|
- /// 页面loadding
|
|
|
|
- bool loaded = false;
|
|
|
|
|
|
+ /// 隐藏全屏loadding
|
|
|
|
+ bool _hideFullScreenLoading = false;
|
|
|
|
|
|
- // /// 图片loadding
|
|
|
|
|
|
+ /// 图片loadding
|
|
late bool imageLoaded = false;
|
|
late bool imageLoaded = false;
|
|
|
|
|
|
- ///检查图片信息表
|
|
|
|
- List<ExamImageInfo> examImageInfoList = [];
|
|
|
|
-
|
|
|
|
late final measureHandler = Get.find<MeasureHandler>();
|
|
late final measureHandler = Get.find<MeasureHandler>();
|
|
|
|
|
|
/// 测量控制器
|
|
/// 测量控制器
|
|
- late MeasureController measureController = Get.put(MeasureController(
|
|
|
|
- "",
|
|
|
|
- imagesFetchFunc: (code) async {
|
|
|
|
- return examImageInfoList;
|
|
|
|
- },
|
|
|
|
- ));
|
|
|
|
-
|
|
|
|
- /// 获取测量图片所需的图片组 并且写入控制器中 加载
|
|
|
|
- void getExamImageInfoList(List<RemedicalInfoDTO> remedicals) async {
|
|
|
|
- for (var element in remedicals) {
|
|
|
|
- examImageInfoList.add(
|
|
|
|
- ExamImageInfo(
|
|
|
|
- element.terminalImages!.imageUrl!,
|
|
|
|
- element.terminalImages!.previewUrl!,
|
|
|
|
- ),
|
|
|
|
- );
|
|
|
|
- }
|
|
|
|
|
|
+ late MeasureController measureController;
|
|
|
|
|
|
- measureController = Get.put(MeasureController(
|
|
|
|
- "",
|
|
|
|
- imagesFetchFunc: (code) async {
|
|
|
|
- return examImageInfoList;
|
|
|
|
- },
|
|
|
|
- ));
|
|
|
|
-
|
|
|
|
- await measureController.load();
|
|
|
|
- int selectedImageIndex = -1;
|
|
|
|
- if (examImageInfoList
|
|
|
|
- .any((element) => element.url == measureData.itemCurrentImage)) {
|
|
|
|
- ExamImageInfo selectedImage = examImageInfoList.firstWhere(
|
|
|
|
- (element) => element.url == measureData.itemCurrentImage,
|
|
|
|
- );
|
|
|
|
- selectedImageIndex = examImageInfoList.indexOf(selectedImage);
|
|
|
|
- measureController.examInfo.selectedImageIndex = selectedImageIndex;
|
|
|
|
- }
|
|
|
|
- MeasureLanguage.load(measureData.measureLanguage);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- void changeImage(sender, e) {
|
|
|
|
|
|
+ /// 响应图片切换事件通知
|
|
|
|
+ void _onChangeImage(sender, e) {
|
|
imageLoaded = e;
|
|
imageLoaded = e;
|
|
setState(() {});
|
|
setState(() {});
|
|
}
|
|
}
|
|
|
|
|
|
- void changeFullScreenState(sender, e) {
|
|
|
|
|
|
+ /// 响应全屏状态切换事件
|
|
|
|
+ void _onChangeFullScreenState(sender, e) {
|
|
setState(() {});
|
|
setState(() {});
|
|
}
|
|
}
|
|
|
|
|
|
- @override
|
|
|
|
- void initState() {
|
|
|
|
- loadLayoutConfig();
|
|
|
|
- getImageInfo();
|
|
|
|
- measureHandler.onChangeImageLoaded.addListener(changeImage);
|
|
|
|
- measureHandler.onChangeFullScreenState.addListener(changeFullScreenState);
|
|
|
|
- super.initState();
|
|
|
|
|
|
+ /// 在此处动态刷新测量窗口,而不是重置窗口
|
|
|
|
+ void _onUpdateState(sender, Map<String, String> parameters) async {
|
|
|
|
+ _curNeedRouterBack = false;
|
|
|
|
+ bool needUpdate = false;
|
|
|
|
+ if (_curPatientCode == (parameters['patientCode'] ?? '')) {
|
|
|
|
+ if (_curRemedicalCode == (parameters['remedicalCode'] ?? '')) {
|
|
|
|
+ } else {
|
|
|
|
+ measureHandler.changeImageByRemedicalCode
|
|
|
|
+ .emit(this, parameters['remedicalCode'] ?? '');
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ needUpdate = true;
|
|
|
|
+ }
|
|
|
|
+ _curToken = parameters['token'] ?? '';
|
|
|
|
+ _curPatientCode = parameters['patientCode'] ?? '';
|
|
|
|
+ _curRemedicalCode = parameters['remedicalCode'] ?? '';
|
|
|
|
+ _curRecordCode = parameters['recordCode'] ?? '';
|
|
|
|
+
|
|
|
|
+ if (needUpdate) {
|
|
|
|
+ await LayoutConfiguration.ins.loadData();
|
|
|
|
+ List<RemedicalInfoDTO> remedicals = await _getCurRemedicals();
|
|
|
|
+ _initMouseModuel();
|
|
|
|
+ _initCarotidModuel(remedicals);
|
|
|
|
+ measureData.remedicalList = remedicals;
|
|
|
|
+ var remedicalInfo =
|
|
|
|
+ await measureData.getImageInfo.call(_curRemedicalCode, _curToken);
|
|
|
|
+ if (remedicalInfo != null) {
|
|
|
|
+ measureData.aiResults = remedicalInfo.diagnosisResult ?? '';
|
|
|
|
+
|
|
|
|
+ if (remedicalInfo.terminalImages != null) {
|
|
|
|
+ _hideFullScreenLoading = true;
|
|
|
|
+ measureData.itemCurrentImage =
|
|
|
|
+ remedicalInfo.terminalImages!.imageUrl ?? '';
|
|
|
|
+ getExamImageInfoList(remedicals);
|
|
|
|
+ measureHandler.changeImageList.emit(this, remedicals);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ measureController.imageLoaded.removeListener(_onImageLoaded);
|
|
|
|
+ measureController.imageLoaded.addListener(_onImageLoaded);
|
|
|
|
+ }
|
|
|
|
+ _setCurImageData();
|
|
}
|
|
}
|
|
|
|
|
|
- void getImageInfo() {
|
|
|
|
|
|
+ /// 将当前的图像信息同步到 measureData 中
|
|
|
|
+ void _setCurImageData() {
|
|
measureData.measureImageData = MeasureImageData(
|
|
measureData.measureImageData = MeasureImageData(
|
|
- patientCode: widget.patientCode,
|
|
|
|
- recordCode: widget.recordCode,
|
|
|
|
- remedicalCode: widget.remedicalCode,
|
|
|
|
|
|
+ patientCode: _curPatientCode,
|
|
|
|
+ recordCode: _curRecordCode,
|
|
|
|
+ remedicalCode: _curRemedicalCode,
|
|
);
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
- /// 加载图像布局配置
|
|
|
|
- void loadLayoutConfig() async {
|
|
|
|
|
|
+ /// 先加载图像布局配置,然后加载全局数据
|
|
|
|
+ void _loadLayoutConfig() async {
|
|
await LayoutConfiguration.ins.loadData();
|
|
await LayoutConfiguration.ins.loadData();
|
|
setState(() {
|
|
setState(() {
|
|
- // 加载图像数据
|
|
|
|
_initData();
|
|
_initData();
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- void onImageLoaded(Object sender, ExamImageInfo? e) async {
|
|
|
|
- // measureHandler.changeImageLoaded = true;
|
|
|
|
- if (!mounted) return;
|
|
|
|
- final currentImage = measureData.remedicalList.firstWhereOrNull(
|
|
|
|
- (element) => element.terminalImages!.imageUrl == e!.url,
|
|
|
|
- );
|
|
|
|
- if (currentImage != null) {
|
|
|
|
- /// 获取图片详细信息
|
|
|
|
- var remedicalInfo = await measureData.getImageInfo(
|
|
|
|
- currentImage.remedicalCode ?? '',
|
|
|
|
- widget.token,
|
|
|
|
- );
|
|
|
|
- if (remedicalInfo != null) {
|
|
|
|
- measureData.aiResults = remedicalInfo.diagnosisResult ?? '';
|
|
|
|
- measure3DViewController.initParams();
|
|
|
|
-
|
|
|
|
- /// ai 良恶性 判断是否有ai
|
|
|
|
- measureData.diagnosisConclusion = remedicalInfo.diagnosisConclusion;
|
|
|
|
- if (remedicalInfo.carotidResult != null) {
|
|
|
|
- /// [Carotid] ✅详情传入测量信息
|
|
|
|
- measure3DViewController.carotidResult = remedicalInfo.carotidResult!;
|
|
|
|
-
|
|
|
|
- /// [Carotid] ✅需要在此通知 controller 存在颈动脉信息
|
|
|
|
- measure3DViewController.exist3DData = true;
|
|
|
|
- measure3DViewController
|
|
|
|
- .handleChangeCarotid2DImage(remedicalInfo.recordCode!);
|
|
|
|
- } else {
|
|
|
|
- measure3DViewController.exist3DData = false;
|
|
|
|
- }
|
|
|
|
- // [Carotid] ✅只要更换图片都要切换到Vid 2D模式
|
|
|
|
- if (measure3DViewController.curMeasureMode != MeasureMode.vidMode) {
|
|
|
|
- measure3DViewController.backToVidMode();
|
|
|
|
- }
|
|
|
|
- try {
|
|
|
|
- if (e != null) {
|
|
|
|
- Future.delayed(const Duration(milliseconds: 100), () {
|
|
|
|
- measureController.playerController.play();
|
|
|
|
- });
|
|
|
|
- setState(() {
|
|
|
|
- loaded = true;
|
|
|
|
- measureHandler.changeImageLoaded = false;
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- } catch (error) {
|
|
|
|
- setState(() {
|
|
|
|
- loaded = true;
|
|
|
|
- measureHandler.changeImageLoaded = false;
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ @override
|
|
|
|
+ void initState() {
|
|
|
|
+ _curToken = widget.token;
|
|
|
|
+ _curPatientCode = widget.patientCode;
|
|
|
|
+ _curRemedicalCode = widget.remedicalCode;
|
|
|
|
+ _curRecordCode = widget.recordCode;
|
|
|
|
+ _curNeedRouterBack = widget.needRouterBack;
|
|
|
|
+ _hideFullScreenLoading = false;
|
|
|
|
+ _loadLayoutConfig();
|
|
|
|
+ _setCurImageData();
|
|
|
|
+ measureData.curMeasureDataChanged.addListener(_onUpdateState);
|
|
|
|
+ measureHandler.onChangeImageLoaded.addListener(_onChangeImage);
|
|
|
|
+ measureHandler.onChangeFullScreenState
|
|
|
|
+ .addListener(_onChangeFullScreenState);
|
|
|
|
+ super.initState();
|
|
}
|
|
}
|
|
|
|
|
|
@override
|
|
@override
|
|
void dispose() {
|
|
void dispose() {
|
|
- measureHandler.onChangeImageLoaded.removeListener(changeImage);
|
|
|
|
|
|
+ measureData.curMeasureDataChanged.removeListener(_onUpdateState);
|
|
|
|
+ measureHandler.onChangeImageLoaded.removeListener(_onChangeImage);
|
|
measureHandler.onChangeFullScreenState
|
|
measureHandler.onChangeFullScreenState
|
|
- .removeListener(changeFullScreenState);
|
|
|
|
|
|
+ .removeListener(_onChangeFullScreenState);
|
|
super.dispose();
|
|
super.dispose();
|
|
}
|
|
}
|
|
|
|
|
|
@override
|
|
@override
|
|
FWidget build(BuildContext context) {
|
|
FWidget build(BuildContext context) {
|
|
FWidget body;
|
|
FWidget body;
|
|
- if (!loaded) {
|
|
|
|
|
|
+ if (!_hideFullScreenLoading) {
|
|
const loadingWidget = FCenter(child: FCircularProgressIndicator());
|
|
const loadingWidget = FCenter(child: FCircularProgressIndicator());
|
|
body = FRow(
|
|
body = FRow(
|
|
children: const [
|
|
children: const [
|
|
@@ -221,7 +190,7 @@ class _MeasureMainPageState extends State<MeasureMainPage> {
|
|
children: [
|
|
children: [
|
|
FOffstage(
|
|
FOffstage(
|
|
child: _MeasureLeftBoard(
|
|
child: _MeasureLeftBoard(
|
|
- needRouterBack: widget.needRouterBack,
|
|
|
|
|
|
+ needRouterBack: _curNeedRouterBack,
|
|
),
|
|
),
|
|
offstage: measureHandler.fullScreenState),
|
|
offstage: measureHandler.fullScreenState),
|
|
const FVerticalDivider(),
|
|
const FVerticalDivider(),
|
|
@@ -252,7 +221,6 @@ class _MeasureMainPageState extends State<MeasureMainPage> {
|
|
],
|
|
],
|
|
);
|
|
);
|
|
}
|
|
}
|
|
-
|
|
|
|
return FCenter(
|
|
return FCenter(
|
|
child: FContainer(
|
|
child: FContainer(
|
|
color: const Color.fromRGBO(70, 70, 70, 1),
|
|
color: const Color.fromRGBO(70, 70, 70, 1),
|
|
@@ -261,79 +229,157 @@ class _MeasureMainPageState extends State<MeasureMainPage> {
|
|
);
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
- MeasureCursorType _getMeasureSystemSettingCursorType(
|
|
|
|
- CursorTypeEnum cursorType,
|
|
|
|
- ) {
|
|
|
|
- switch (cursorType) {
|
|
|
|
- case CursorTypeEnum.CursorType1Icon:
|
|
|
|
- return MeasureCursorType.cursor01;
|
|
|
|
- case CursorTypeEnum.CursorType2Icon:
|
|
|
|
- return MeasureCursorType.cursor02;
|
|
|
|
- case CursorTypeEnum.CursorType3Icon:
|
|
|
|
- return MeasureCursorType.cursor03;
|
|
|
|
- case CursorTypeEnum.CursorType4Icon:
|
|
|
|
- return MeasureCursorType.cursor04;
|
|
|
|
- case CursorTypeEnum.CursorType5Icon:
|
|
|
|
- return MeasureCursorType.cursor05;
|
|
|
|
- default:
|
|
|
|
- return MeasureCursorType.cursor01;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /// 初始化卡尺样式部分
|
|
|
|
- Future<void> _getMeasureSystemSetting() async {
|
|
|
|
- final mouseState = Get.put<IMouseState>(MouseState());
|
|
|
|
- final result = await measureData.getMeasureSystemSettingAsync()
|
|
|
|
- as MeasureSystemSettingDTO;
|
|
|
|
- measureData.measureSystemSetting = result;
|
|
|
|
- mouseState.cursorType =
|
|
|
|
- getMeasureSystemSettingCursorType(result.cursorType);
|
|
|
|
- mouseState.cursorSize = result.cursorSize.toDouble();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- void _initData() async {
|
|
|
|
|
|
+ /// 获取当前状态下的图像集
|
|
|
|
+ Future<List<RemedicalInfoDTO>> _getCurRemedicals() async {
|
|
List<RemedicalInfoDTO> remedicals = [];
|
|
List<RemedicalInfoDTO> remedicals = [];
|
|
- List<Ultra3DResourceInfo> ultra3DResourceInfos = [];
|
|
|
|
- loaded = false;
|
|
|
|
|
|
|
|
var value = await measureData.getRemedicalList.call(
|
|
var value = await measureData.getRemedicalList.call(
|
|
- widget.patientCode,
|
|
|
|
- widget.recordCode,
|
|
|
|
- widget.token,
|
|
|
|
|
|
+ _curPatientCode,
|
|
|
|
+ _curRecordCode,
|
|
|
|
+ _curToken,
|
|
);
|
|
);
|
|
|
|
|
|
for (var remedicalItemList in value) {
|
|
for (var remedicalItemList in value) {
|
|
remedicals.addAll(remedicalItemList.remedicalList ?? []);
|
|
remedicals.addAll(remedicalItemList.remedicalList ?? []);
|
|
}
|
|
}
|
|
|
|
|
|
- /// 获取样式
|
|
|
|
- _getMeasureSystemSetting();
|
|
|
|
|
|
+ return remedicals;
|
|
|
|
+ }
|
|
|
|
|
|
- /// [Carotid] ✅遍历出颈动脉信息列表,传给壳子
|
|
|
|
|
|
+ /// 初始化颈动脉模块
|
|
|
|
+ /// [Carotid] ✅遍历出颈动脉信息列表,传给壳子
|
|
|
|
+ void _initCarotidModuel(List<RemedicalInfoDTO> remedicals) {
|
|
|
|
+ List<Ultra3DResourceInfo> ultra3DResourceInfos = [];
|
|
for (var remedical in remedicals) {
|
|
for (var remedical in remedicals) {
|
|
if (remedical.carotidResult != null) {
|
|
if (remedical.carotidResult != null) {
|
|
ultra3DResourceInfos.add(Ultra3DResourceInfo(remedical.carotidResult!));
|
|
ultra3DResourceInfos.add(Ultra3DResourceInfo(remedical.carotidResult!));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
measure3DViewController.ultra3DResourceInfoList = ultra3DResourceInfos;
|
|
measure3DViewController.ultra3DResourceInfoList = ultra3DResourceInfos;
|
|
- measure3DViewController.recordId = widget.recordCode;
|
|
|
|
|
|
+ measure3DViewController.recordId = _curRecordCode;
|
|
measure3DViewController.notifyShellLoadAllModel();
|
|
measure3DViewController.notifyShellLoadAllModel();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// 初始化卡尺样式部分
|
|
|
|
+ Future<void> _initMouseModuel() async {
|
|
|
|
+ final mouseState = Get.put<IMouseState>(MouseState());
|
|
|
|
+ final result = await measureData.getMeasureSystemSettingAsync()
|
|
|
|
+ as MeasureSystemSettingDTO;
|
|
|
|
+ measureData.measureSystemSetting = result;
|
|
|
|
+ mouseState.cursorType =
|
|
|
|
+ getMeasureSystemSettingCursorType(result.cursorType);
|
|
|
|
+ mouseState.cursorSize = result.cursorSize.toDouble();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// 测量页全局数据首次初始化
|
|
|
|
+ void _initData() async {
|
|
|
|
+ List<RemedicalInfoDTO> remedicals = await _getCurRemedicals();
|
|
|
|
+ _initMouseModuel();
|
|
|
|
+ _initCarotidModuel(remedicals);
|
|
measureData.remedicalList = remedicals;
|
|
measureData.remedicalList = remedicals;
|
|
var remedicalInfo =
|
|
var remedicalInfo =
|
|
- await measureData.getImageInfo.call(widget.remedicalCode, widget.token);
|
|
|
|
|
|
+ await measureData.getImageInfo.call(_curRemedicalCode, _curToken);
|
|
if (remedicalInfo != null) {
|
|
if (remedicalInfo != null) {
|
|
measureData.aiResults = remedicalInfo.diagnosisResult ?? '';
|
|
measureData.aiResults = remedicalInfo.diagnosisResult ?? '';
|
|
|
|
|
|
if (remedicalInfo.terminalImages != null) {
|
|
if (remedicalInfo.terminalImages != null) {
|
|
- loaded = true;
|
|
|
|
|
|
+ _hideFullScreenLoading = true;
|
|
measureData.itemCurrentImage =
|
|
measureData.itemCurrentImage =
|
|
remedicalInfo.terminalImages!.imageUrl ?? '';
|
|
remedicalInfo.terminalImages!.imageUrl ?? '';
|
|
getExamImageInfoList(remedicals);
|
|
getExamImageInfoList(remedicals);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- measureController.imageLoaded.removeListener(onImageLoaded);
|
|
|
|
- measureController.imageLoaded.addListener(onImageLoaded);
|
|
|
|
|
|
+ measureController.imageLoaded.removeListener(_onImageLoaded);
|
|
|
|
+ measureController.imageLoaded.addListener(_onImageLoaded);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// 获取测量图片所需的图片组 并且写入控制器中 加载
|
|
|
|
+ void getExamImageInfoList(List<RemedicalInfoDTO> remedicals) async {
|
|
|
|
+ /// 检查中图片信息表
|
|
|
|
+ List<ExamImageInfo> examImageInfoList = [];
|
|
|
|
+ for (var element in remedicals) {
|
|
|
|
+ examImageInfoList.add(
|
|
|
|
+ ExamImageInfo(
|
|
|
|
+ element.terminalImages!.imageUrl!,
|
|
|
|
+ element.terminalImages!.previewUrl!,
|
|
|
|
+ ),
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Get.delete<MeasureController>();
|
|
|
|
+ measureController = Get.put(MeasureController(
|
|
|
|
+ "",
|
|
|
|
+ imagesFetchFunc: (code) async {
|
|
|
|
+ return examImageInfoList;
|
|
|
|
+ },
|
|
|
|
+ ));
|
|
|
|
+
|
|
|
|
+ await measureController.load();
|
|
|
|
+ int selectedImageIndex = -1;
|
|
|
|
+ if (examImageInfoList
|
|
|
|
+ .any((element) => element.url == measureData.itemCurrentImage)) {
|
|
|
|
+ ExamImageInfo selectedImage = examImageInfoList.firstWhere(
|
|
|
|
+ (element) => element.url == measureData.itemCurrentImage,
|
|
|
|
+ );
|
|
|
|
+ selectedImageIndex = examImageInfoList.indexOf(selectedImage);
|
|
|
|
+ measureController.examInfo.selectedImageIndex = selectedImageIndex;
|
|
|
|
+ }
|
|
|
|
+ MeasureLanguage.load(measureData.measureLanguage);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /// vid 切换时会触发到这里
|
|
|
|
+ void _onImageLoaded(Object sender, ExamImageInfo? e) async {
|
|
|
|
+ // measureHandler.changeImageLoaded = true;
|
|
|
|
+ if (!mounted) return;
|
|
|
|
+ final currentImage = measureData.remedicalList.firstWhereOrNull(
|
|
|
|
+ (element) => element.terminalImages!.imageUrl == e!.url,
|
|
|
|
+ );
|
|
|
|
+ if (currentImage != null) {
|
|
|
|
+ /// 获取图片详细信息
|
|
|
|
+ var remedicalInfo = await measureData.getImageInfo(
|
|
|
|
+ currentImage.remedicalCode ?? '',
|
|
|
|
+ _curToken,
|
|
|
|
+ );
|
|
|
|
+ if (remedicalInfo != null) {
|
|
|
|
+ measureData.aiResults = remedicalInfo.diagnosisResult ?? '';
|
|
|
|
+ measure3DViewController.initParams();
|
|
|
|
+
|
|
|
|
+ /// ai 良恶性 判断是否有ai
|
|
|
|
+ measureData.diagnosisConclusion = remedicalInfo.diagnosisConclusion;
|
|
|
|
+ if (remedicalInfo.carotidResult != null) {
|
|
|
|
+ /// [Carotid] ✅详情传入测量信息
|
|
|
|
+ measure3DViewController.carotidResult = remedicalInfo.carotidResult!;
|
|
|
|
+
|
|
|
|
+ /// [Carotid] ✅需要在此通知 controller 存在颈动脉信息
|
|
|
|
+ measure3DViewController.exist3DData = true;
|
|
|
|
+ measure3DViewController
|
|
|
|
+ .handleChangeCarotid2DImage(remedicalInfo.recordCode!);
|
|
|
|
+ } else {
|
|
|
|
+ measure3DViewController.exist3DData = false;
|
|
|
|
+ }
|
|
|
|
+ // [Carotid] ✅只要更换图片都要切换到Vid 2D模式
|
|
|
|
+ if (measure3DViewController.curMeasureMode != MeasureMode.vidMode) {
|
|
|
|
+ measure3DViewController.backToVidMode();
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ if (e != null) {
|
|
|
|
+ Future.delayed(const Duration(milliseconds: 100), () {
|
|
|
|
+ measureController.playerController.play();
|
|
|
|
+ });
|
|
|
|
+ setState(() {
|
|
|
|
+ _hideFullScreenLoading = true;
|
|
|
|
+ measureHandler.changeImageLoaded = false;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ } catch (error) {
|
|
|
|
+ setState(() {
|
|
|
|
+ _hideFullScreenLoading = true;
|
|
|
|
+ measureHandler.changeImageLoaded = false;
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -384,7 +430,7 @@ class _MeasureLeftBoardState extends State<_MeasureLeftBoard> {
|
|
}
|
|
}
|
|
|
|
|
|
///图像发生变化
|
|
///图像发生变化
|
|
- void changeImage(sender, e) {
|
|
|
|
|
|
+ void _onChangeImage(sender, e) {
|
|
setState(() {});
|
|
setState(() {});
|
|
}
|
|
}
|
|
|
|
|
|
@@ -393,7 +439,7 @@ class _MeasureLeftBoardState extends State<_MeasureLeftBoard> {
|
|
measureHandler.onChangedTab.addListener(_onChangedTab);
|
|
measureHandler.onChangedTab.addListener(_onChangedTab);
|
|
measure3DViewController.updatePlayerMode.addListener(_onModeChanged);
|
|
measure3DViewController.updatePlayerMode.addListener(_onModeChanged);
|
|
measureData.curItemMetaListChanged.addListener(_onCurItemMetaListChanged);
|
|
measureData.curItemMetaListChanged.addListener(_onCurItemMetaListChanged);
|
|
- measureHandler.onChangeImageLoaded.addListener(changeImage);
|
|
|
|
|
|
+ measureHandler.onChangeImageLoaded.addListener(_onChangeImage);
|
|
super.initState();
|
|
super.initState();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -403,7 +449,7 @@ class _MeasureLeftBoardState extends State<_MeasureLeftBoard> {
|
|
measure3DViewController.updatePlayerMode.removeListener(_onModeChanged);
|
|
measure3DViewController.updatePlayerMode.removeListener(_onModeChanged);
|
|
measureData.curItemMetaListChanged
|
|
measureData.curItemMetaListChanged
|
|
.removeListener(_onCurItemMetaListChanged);
|
|
.removeListener(_onCurItemMetaListChanged);
|
|
- measureHandler.onChangeImageLoaded.removeListener(changeImage);
|
|
|
|
|
|
+ measureHandler.onChangeImageLoaded.removeListener(_onChangeImage);
|
|
super.dispose();
|
|
super.dispose();
|
|
}
|
|
}
|
|
|
|
|