main.dart 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. import 'package:fis_i18n/i18n.dart';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:flutter/material.dart';
  4. // import 'package:flyinsono/pages/remedical/consultation/controller.dart';
  5. /// 带数据回调
  6. typedef void ValueCallback<T>(T value);
  7. /// 所有图片的入口
  8. class ImageStatus extends StatelessWidget {
  9. /// 图片类型
  10. final RemedicalFileDataTypeEnum fileDataType;
  11. /// 图片地址
  12. final TerminalImageDTO terminalImage;
  13. /// AI 良恶性
  14. final DiagnosisConclusionEnum? diagnosisConclusion;
  15. /// 是否是测量页面
  16. final bool? isMeasure;
  17. /// 改变图片地址
  18. final VoidCallback? onChangeImage;
  19. /// AI测量的器官
  20. final List<DiagnosisOrganEnum>? diagnosisOrgans;
  21. /// 打开测量页面的方法
  22. final ValueCallback? onOpenMeasure;
  23. ImageStatus({
  24. Key? key,
  25. required this.fileDataType,
  26. required this.terminalImage,
  27. this.diagnosisConclusion = DiagnosisConclusionEnum.NotRequired,
  28. this.diagnosisOrgans = const [DiagnosisOrganEnum.Null],
  29. this.isMeasure = false,
  30. this.onChangeImage,
  31. this.onOpenMeasure,
  32. }) : super(key: key);
  33. @override
  34. Widget build(BuildContext context) {
  35. Map<
  36. Enum,
  37. Widget Function(
  38. TerminalImageDTO imageUrlMap,
  39. )> buildItem = {
  40. RemedicalFileDataTypeEnum.Image: (
  41. imageUrlMap,
  42. ) =>
  43. _buildImageCard(
  44. imageUrlMap,
  45. ),
  46. RemedicalFileDataTypeEnum.ThirdVidSingle: (
  47. imageUrlMap,
  48. ) =>
  49. _buildImageCard(
  50. imageUrlMap,
  51. ),
  52. RemedicalFileDataTypeEnum.ThirdVidMovie: (
  53. imageUrlMap,
  54. ) =>
  55. _buildVidMovieCard(
  56. imageUrlMap,
  57. ),
  58. RemedicalFileDataTypeEnum.VinnoVidSingle: (
  59. imageUrlMap,
  60. ) =>
  61. _buildImageCard(
  62. imageUrlMap,
  63. ),
  64. RemedicalFileDataTypeEnum.VinnoVidMovie: (
  65. imageUrlMap,
  66. ) =>
  67. _buildVidMovieCard(
  68. imageUrlMap,
  69. ),
  70. };
  71. return buildItem[fileDataType]!(terminalImage);
  72. }
  73. Widget _buildVidMovieCard(
  74. TerminalImageDTO imageUrlMap,
  75. ) {
  76. return Listener(
  77. child: Container(
  78. width: 190,
  79. height: 160,
  80. color: Colors.black,
  81. child: Stack(
  82. children: [
  83. Center(
  84. child: Image.network(
  85. imageUrlMap.previewUrl!,
  86. errorBuilder: ((context, error, stackTrace) {
  87. return Container(
  88. child: Text('error'),
  89. );
  90. }),
  91. ),
  92. ),
  93. Positioned(
  94. bottom: 5,
  95. left: 5,
  96. child: _buildAIDiagnosticOrgans(),
  97. ),
  98. InkWell(
  99. onTap: () {
  100. !isMeasure!
  101. ? onOpenMeasure!.call(imageUrlMap.imageUrl!)
  102. : onChangeImage!.call();
  103. },
  104. child: Center(
  105. child: Container(
  106. child: Icon(
  107. Icons.play_circle_outline_rounded,
  108. color: Colors.white,
  109. size: 50,
  110. ),
  111. ),
  112. ),
  113. ),
  114. Positioned(
  115. bottom: 5,
  116. right: 5,
  117. child: Tooltip(
  118. textStyle: TextStyle(
  119. fontSize: 16,
  120. color: Colors.white,
  121. ),
  122. message: _buildAIText(diagnosisConclusion!),
  123. child: Text(
  124. 'AI',
  125. style: TextStyle(
  126. color: _buildAITextColor(
  127. diagnosisConclusion!,
  128. ),
  129. fontSize: 20,
  130. ),
  131. ),
  132. ),
  133. ),
  134. ],
  135. ),
  136. ),
  137. );
  138. }
  139. Widget _buildImageCard(
  140. TerminalImageDTO imageUrlMap,
  141. ) {
  142. return Listener(
  143. child: InkWell(
  144. onTap: () {
  145. !isMeasure!
  146. ? onOpenMeasure!.call(imageUrlMap.imageUrl!)
  147. : onChangeImage!.call();
  148. },
  149. child: Container(
  150. width: 190,
  151. height: 160,
  152. color: Colors.black,
  153. child: Stack(
  154. children: [
  155. Center(
  156. child: Image.network(
  157. imageUrlMap.previewUrl!,
  158. errorBuilder: ((context, error, stackTrace) {
  159. return Container(
  160. child: Text('error'),
  161. );
  162. }),
  163. ),
  164. ),
  165. Positioned(
  166. bottom: 5,
  167. left: 5,
  168. child: _buildAIDiagnosticOrgans(),
  169. ),
  170. Positioned(
  171. bottom: 5,
  172. right: 5,
  173. child: Tooltip(
  174. textStyle: TextStyle(
  175. fontSize: 16,
  176. color: Colors.white,
  177. ),
  178. message: _buildAIText(diagnosisConclusion!),
  179. child: Text(
  180. 'AI',
  181. style: TextStyle(
  182. color: _buildAITextColor(
  183. diagnosisConclusion!,
  184. ),
  185. fontSize: 20,
  186. ),
  187. ),
  188. ),
  189. ),
  190. ],
  191. ),
  192. ),
  193. ),
  194. );
  195. }
  196. String _buildAIText(DiagnosisConclusionEnum diagnosisConclusion) {
  197. switch (diagnosisConclusion) {
  198. case DiagnosisConclusionEnum.NotRequired:
  199. return i18nBook.remedical.noNeedAIYet.t;
  200. case DiagnosisConclusionEnum.InProcess:
  201. return i18nBook.remedical.didNotHandle.t;
  202. case DiagnosisConclusionEnum.Unrecognized:
  203. return i18nBook.remedical.didNotIdentify.t;
  204. case DiagnosisConclusionEnum.NoObviousLesion:
  205. return i18nBook.remedical.noAbnormal.t;
  206. case DiagnosisConclusionEnum.Benign:
  207. return i18nBook.remedical.benign.t;
  208. case DiagnosisConclusionEnum.Malignant:
  209. return i18nBook.remedical.malignant.t;
  210. case DiagnosisConclusionEnum.BenignAndMalignant:
  211. return i18nBook.remedical.benignWithMalignant.t;
  212. default:
  213. return i18nBook.remedical.didNotIdentify.t;
  214. }
  215. }
  216. dynamic _buildAITextColor(DiagnosisConclusionEnum diagnosisConclusion) {
  217. switch (diagnosisConclusion) {
  218. case DiagnosisConclusionEnum.NotRequired:
  219. return Colors.transparent;
  220. case DiagnosisConclusionEnum.InProcess:
  221. return Colors.lightBlue;
  222. case DiagnosisConclusionEnum.Unrecognized:
  223. return Colors.lightBlue;
  224. case DiagnosisConclusionEnum.NoObviousLesion:
  225. return Colors.lightBlue;
  226. case DiagnosisConclusionEnum.Benign:
  227. return Colors.greenAccent;
  228. case DiagnosisConclusionEnum.Malignant:
  229. return Colors.redAccent;
  230. case DiagnosisConclusionEnum.BenignAndMalignant:
  231. return Colors.redAccent;
  232. default:
  233. return Colors.transparent;
  234. }
  235. }
  236. Widget _buildAIDiagnosticOrgans() {
  237. switch (diagnosisOrgans?.length == 0
  238. ? DiagnosisOrganEnum.Null
  239. : diagnosisOrgans?[0]) {
  240. case DiagnosisOrganEnum.Null:
  241. return const SizedBox();
  242. case DiagnosisOrganEnum.placeHolder_1:
  243. return const SizedBox();
  244. case DiagnosisOrganEnum.Breast:
  245. return Text(
  246. i18nBook.remedical.breast.t,
  247. style: TextStyle(
  248. color: _buildAITextColor(
  249. diagnosisConclusion!,
  250. ),
  251. fontSize: 18,
  252. ),
  253. );
  254. case DiagnosisOrganEnum.Abdomen:
  255. return Text(
  256. i18nBook.bodyParts.abdomen.t,
  257. style: TextStyle(
  258. color: _buildAITextColor(
  259. diagnosisConclusion!,
  260. ),
  261. fontSize: 18,
  262. ),
  263. );
  264. case DiagnosisOrganEnum.Liver:
  265. return Text(
  266. i18nBook.remedical.liver.t,
  267. style: TextStyle(
  268. color: _buildAITextColor(
  269. diagnosisConclusion!,
  270. ),
  271. fontSize: 18,
  272. ),
  273. );
  274. case DiagnosisOrganEnum.Cholecyst:
  275. return Text(
  276. i18nBook.remedical.cholecyst.t,
  277. style: TextStyle(
  278. color: _buildAITextColor(
  279. diagnosisConclusion!,
  280. ),
  281. fontSize: 18,
  282. ),
  283. );
  284. case DiagnosisOrganEnum.Kidney:
  285. return Text(
  286. i18nBook.remedical.kidney.t,
  287. style: TextStyle(
  288. color: _buildAITextColor(
  289. diagnosisConclusion!,
  290. ),
  291. fontSize: 18,
  292. ),
  293. );
  294. case DiagnosisOrganEnum.Spleen:
  295. return Text(
  296. i18nBook.remedical.spleen.t,
  297. style: TextStyle(
  298. color: _buildAITextColor(
  299. diagnosisConclusion!,
  300. ),
  301. fontSize: 18,
  302. ),
  303. );
  304. default:
  305. return Container();
  306. }
  307. }
  308. }