import 'package:fis_i18n/i18n.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:flutter/material.dart'; // import 'package:flyinsono/pages/remedical/consultation/controller.dart'; /// 带数据回调 typedef void ValueCallback(T value); /// 所有图片的入口 class ImageStatus extends StatelessWidget { /// 图片类型 final RemedicalFileDataTypeEnum fileDataType; /// 图片地址 final TerminalImageDTO terminalImage; /// AI 良恶性 final DiagnosisConclusionEnum? diagnosisConclusion; /// 是否是测量页面 final bool? isMeasure; /// 改变图片地址 final VoidCallback? onChangeImage; /// AI测量的器官 final List? diagnosisOrgans; /// 打开测量页面的方法 final ValueCallback? onOpenMeasure; ImageStatus({ Key? key, required this.fileDataType, required this.terminalImage, this.diagnosisConclusion = DiagnosisConclusionEnum.NotRequired, this.diagnosisOrgans = const [DiagnosisOrganEnum.Null], this.isMeasure = false, this.onChangeImage, this.onOpenMeasure, }) : super(key: key); @override Widget build(BuildContext context) { Map< Enum, Widget Function( TerminalImageDTO imageUrlMap, )> buildItem = { RemedicalFileDataTypeEnum.Image: ( imageUrlMap, ) => _buildImageCard( imageUrlMap, ), RemedicalFileDataTypeEnum.ThirdVidSingle: ( imageUrlMap, ) => _buildImageCard( imageUrlMap, ), RemedicalFileDataTypeEnum.ThirdVidMovie: ( imageUrlMap, ) => _buildVidMovieCard( imageUrlMap, ), RemedicalFileDataTypeEnum.VinnoVidSingle: ( imageUrlMap, ) => _buildImageCard( imageUrlMap, ), RemedicalFileDataTypeEnum.VinnoVidMovie: ( imageUrlMap, ) => _buildVidMovieCard( imageUrlMap, ), }; return buildItem[fileDataType]!(terminalImage); } Widget _buildVidMovieCard( TerminalImageDTO imageUrlMap, ) { return Listener( child: Container( width: 190, height: 160, color: Colors.black, child: Stack( children: [ Center( child: Image.network( imageUrlMap.previewUrl!, errorBuilder: ((context, error, stackTrace) { return Container( child: Text('error'), ); }), ), ), Positioned( bottom: 5, left: 5, child: _buildAIDiagnosticOrgans(), ), InkWell( onTap: () { !isMeasure! ? onOpenMeasure!.call(imageUrlMap.imageUrl!) : onChangeImage!.call(); }, child: Center( child: Container( child: Icon( Icons.play_circle_outline_rounded, color: Colors.white, size: 50, ), ), ), ), Positioned( bottom: 5, right: 5, child: Tooltip( textStyle: TextStyle( fontSize: 16, color: Colors.white, ), message: _buildAIText(diagnosisConclusion!), child: Text( 'AI', style: TextStyle( color: _buildAITextColor( diagnosisConclusion!, ), fontSize: 20, ), ), ), ), ], ), ), ); } Widget _buildImageCard( TerminalImageDTO imageUrlMap, ) { return Listener( child: InkWell( onTap: () { !isMeasure! ? onOpenMeasure!.call(imageUrlMap.imageUrl!) : onChangeImage!.call(); }, child: Container( width: 190, height: 160, color: Colors.black, child: Stack( children: [ Center( child: Image.network( imageUrlMap.previewUrl!, errorBuilder: ((context, error, stackTrace) { return Container( child: Text('error'), ); }), ), ), Positioned( bottom: 5, left: 5, child: _buildAIDiagnosticOrgans(), ), Positioned( bottom: 5, right: 5, child: Tooltip( textStyle: TextStyle( fontSize: 16, color: Colors.white, ), message: _buildAIText(diagnosisConclusion!), child: Text( 'AI', style: TextStyle( color: _buildAITextColor( diagnosisConclusion!, ), fontSize: 20, ), ), ), ), ], ), ), ), ); } String _buildAIText(DiagnosisConclusionEnum diagnosisConclusion) { switch (diagnosisConclusion) { case DiagnosisConclusionEnum.NotRequired: return i18nBook.remedical.noNeedAIYet.t; case DiagnosisConclusionEnum.InProcess: return i18nBook.remedical.didNotHandle.t; case DiagnosisConclusionEnum.Unrecognized: return i18nBook.remedical.didNotIdentify.t; case DiagnosisConclusionEnum.NoObviousLesion: return i18nBook.remedical.noAbnormal.t; case DiagnosisConclusionEnum.Benign: return i18nBook.remedical.benign.t; case DiagnosisConclusionEnum.Malignant: return i18nBook.remedical.malignant.t; case DiagnosisConclusionEnum.BenignAndMalignant: return i18nBook.remedical.benignWithMalignant.t; default: return i18nBook.remedical.didNotIdentify.t; } } dynamic _buildAITextColor(DiagnosisConclusionEnum diagnosisConclusion) { switch (diagnosisConclusion) { case DiagnosisConclusionEnum.NotRequired: return Colors.transparent; case DiagnosisConclusionEnum.InProcess: return Colors.lightBlue; case DiagnosisConclusionEnum.Unrecognized: return Colors.lightBlue; case DiagnosisConclusionEnum.NoObviousLesion: return Colors.lightBlue; case DiagnosisConclusionEnum.Benign: return Colors.greenAccent; case DiagnosisConclusionEnum.Malignant: return Colors.redAccent; case DiagnosisConclusionEnum.BenignAndMalignant: return Colors.redAccent; default: return Colors.transparent; } } Widget _buildAIDiagnosticOrgans() { switch (diagnosisOrgans?.length == 0 ? DiagnosisOrganEnum.Null : diagnosisOrgans?[0]) { case DiagnosisOrganEnum.Null: return const SizedBox(); case DiagnosisOrganEnum.placeHolder_1: return const SizedBox(); case DiagnosisOrganEnum.Breast: return Text( i18nBook.remedical.breast.t, style: TextStyle( color: _buildAITextColor( diagnosisConclusion!, ), fontSize: 18, ), ); case DiagnosisOrganEnum.Abdomen: return Text( i18nBook.bodyParts.abdomen.t, style: TextStyle( color: _buildAITextColor( diagnosisConclusion!, ), fontSize: 18, ), ); case DiagnosisOrganEnum.Liver: return Text( i18nBook.remedical.liver.t, style: TextStyle( color: _buildAITextColor( diagnosisConclusion!, ), fontSize: 18, ), ); case DiagnosisOrganEnum.Cholecyst: return Text( i18nBook.remedical.cholecyst.t, style: TextStyle( color: _buildAITextColor( diagnosisConclusion!, ), fontSize: 18, ), ); case DiagnosisOrganEnum.Kidney: return Text( i18nBook.remedical.kidney.t, style: TextStyle( color: _buildAITextColor( diagnosisConclusion!, ), fontSize: 18, ), ); case DiagnosisOrganEnum.Spleen: return Text( i18nBook.remedical.spleen.t, style: TextStyle( color: _buildAITextColor( diagnosisConclusion!, ), fontSize: 18, ), ); default: return Container(); } } }