measure_images_bar.dart 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. import 'package:fis_jsonrpc/rpc.dart';
  2. import 'package:fis_measure/interfaces/process/workspace/exam_info.dart';
  3. import 'package:fis_measure/process/workspace/measure_controller.dart';
  4. import 'package:fis_measure/process/workspace/measure_data_controller.dart';
  5. import 'package:fis_measure/process/workspace/measure_handler.dart';
  6. import 'package:fis_measure/view/measure/measure_images_bar.dart';
  7. export 'package:fis_lib_business_components/index.dart';
  8. import 'package:fis_ui/index.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:get/get.dart';
  11. class MeasureImagesBar extends StatefulWidget implements FWidget {
  12. const MeasureImagesBar({Key? key}) : super(key: key);
  13. @override
  14. State<MeasureImagesBar> createState() => _MeasureImagesBarState();
  15. }
  16. class _MeasureImagesBarState extends State<MeasureImagesBar> {
  17. /// 图片滑动控制器
  18. ScrollController scrollController = ScrollController();
  19. /// 数据
  20. final measureData = Get.find<MeasureDataController>();
  21. /// 当前可滑动的范围宽度
  22. late double width = 0;
  23. /// 是否滑到最后
  24. bool _isEnd = false;
  25. /// 计算下标
  26. int _currentIndex = 0;
  27. /// 左边能否滑动
  28. bool get isLeftCanScroll => _currentIndex <= 0;
  29. /// 右边能否滑动
  30. bool get isRightCanScroll => _isEnd;
  31. /// 滑动区域的key值
  32. final GlobalKey globalKey = GlobalKey();
  33. /// 图片左划事件
  34. void onLeftMoveImage() async {
  35. if (_currentIndex > 0) {
  36. _currentIndex--;
  37. await scrollController.animateTo(
  38. (160 * _currentIndex).toDouble(),
  39. duration: const Duration(milliseconds: 300),
  40. curve: Curves.linear,
  41. );
  42. }
  43. }
  44. /// 图片右划事件
  45. void onRightMoveImage() async {
  46. if (!isRightCanScroll) {
  47. _currentIndex++;
  48. await scrollController.animateTo(
  49. (160 * _currentIndex).toDouble(),
  50. duration: const Duration(milliseconds: 300),
  51. curve: Curves.linear,
  52. );
  53. }
  54. }
  55. @override
  56. Widget build(BuildContext context) {
  57. return FContainer(
  58. height: 120,
  59. margin: const EdgeInsets.symmetric(
  60. vertical: 15,
  61. ),
  62. child: FRow(
  63. children: [
  64. _buildImageListIcon(
  65. FIcons.fis_left_arrow,
  66. isLeftCanScroll,
  67. onLeftMoveImage,
  68. ),
  69. FExpanded(
  70. child: LeftSiderImageList(
  71. scrollController: scrollController,
  72. globalKey: globalKey,
  73. remedicalList: measureData.remedicalList,
  74. ),
  75. ),
  76. _buildImageListIcon(
  77. FIcons.fis_right_arrow,
  78. isRightCanScroll,
  79. onRightMoveImage,
  80. ),
  81. ],
  82. ),
  83. );
  84. }
  85. @override
  86. void initState() {
  87. scrollController.addListener(
  88. () async {
  89. // 如果滑动到最右边
  90. if (scrollController.position.pixels ==
  91. scrollController.position.maxScrollExtent) {
  92. setState(() {
  93. _isEnd = true;
  94. });
  95. } else {
  96. setState(
  97. () {
  98. _isEnd = false;
  99. },
  100. );
  101. }
  102. },
  103. );
  104. super.initState();
  105. }
  106. @override
  107. void didChangeDependencies() {
  108. super.didChangeDependencies();
  109. WidgetsBinding.instance?.addPostFrameCallback(
  110. (mag) {
  111. width = globalKey.currentContext!.size!.width;
  112. setState(
  113. () {
  114. _isEnd = width >= measureData.remedicalList.length * 160;
  115. },
  116. );
  117. },
  118. );
  119. }
  120. @override
  121. void dispose() {
  122. super.dispose();
  123. }
  124. FWidget _buildImageListIcon(
  125. IconData iconsData, bool isCanClick, Function onIconTap) {
  126. return FInkWell(
  127. onTap: () => onIconTap.call(),
  128. child: FContainer(
  129. width: 100,
  130. child: FIcon(
  131. iconsData,
  132. color: isCanClick ? Colors.grey : Colors.white,
  133. size: 30,
  134. ),
  135. ),
  136. );
  137. }
  138. }
  139. /// 当前测量组的所有图片
  140. class LeftSiderImageList extends StatefulWidget implements FWidget {
  141. LeftSiderImageList({
  142. required this.scrollController,
  143. required this.globalKey,
  144. required this.remedicalList,
  145. });
  146. /// 图片滑动控制器
  147. late ScrollController scrollController;
  148. late GlobalKey globalKey;
  149. final List<RemedicalInfoDTO> remedicalList;
  150. @override
  151. State<LeftSiderImageList> createState() => _LeftSiderImageListState();
  152. }
  153. class _LeftSiderImageListState extends State<LeftSiderImageList> {
  154. /// 当前测量的图片
  155. // final measureCurrentImage = Get.put(MeasureGetCurrentImage());
  156. /// 测量AI数据
  157. final measureData = Get.find<MeasureDataController>();
  158. late final measureController = Get.find<MeasureController>();
  159. late final measureHandler = Get.put(MeasureHandler());
  160. int selectedImageIndex = -1;
  161. /// 获取图片地址
  162. void onChangeImage(
  163. String imageUrl,
  164. String remedicalCode,
  165. ) async {
  166. measureHandler.imageChanged = ChangeImageInfo(
  167. imageUrl,
  168. remedicalCode,
  169. );
  170. ExamImageInfo selectedImage = measureController.examInfo.images.firstWhere(
  171. (element) => element.url == imageUrl,
  172. );
  173. selectedImageIndex =
  174. measureController.examInfo.images.indexOf(selectedImage);
  175. measureData.itemCurrentImage = imageUrl;
  176. measureController.examInfo.selectedImageIndex = selectedImageIndex;
  177. setState(() {});
  178. }
  179. @override
  180. void initState() {
  181. super.initState();
  182. }
  183. @override
  184. void dispose() {
  185. super.dispose();
  186. }
  187. @override
  188. FWidget build(BuildContext context) {
  189. return FContainer(
  190. key: ValueKey(measureData.itemCurrentImage),
  191. alignment: Alignment.topCenter,
  192. child: _buildImageList(widget.remedicalList),
  193. );
  194. }
  195. FWidget _buildImageList(List<RemedicalInfoDTO> remedicalItemList) {
  196. return FContainer(
  197. key: widget.globalKey,
  198. child: FListView.builder(
  199. scrollDirection: Axis.horizontal,
  200. shrinkWrap: true,
  201. controller: widget.scrollController,
  202. itemCount: remedicalItemList.toList().length,
  203. itemBuilder: (BuildContext context, int index) {
  204. final FWidget image = ContentImage(
  205. fileDataType: remedicalItemList[index].fileDataType,
  206. terminalImage: TerminalImage(
  207. previewUrl: remedicalItemList[index].terminalImages!.previewUrl,
  208. ),
  209. isMeasure: true,
  210. onChangeImage: () => onChangeImage(
  211. remedicalItemList[index].terminalImages!.imageUrl!,
  212. remedicalItemList[index].remedicalCode!,
  213. ),
  214. );
  215. return FContainer(
  216. key: ValueKey(measureData.itemCurrentImage),
  217. width: 160,
  218. alignment: Alignment.center,
  219. decoration: BoxDecoration(
  220. border: Border.all(
  221. width: 3,
  222. color: remedicalItemList[index].terminalImages!.imageUrl! !=
  223. measureData.itemCurrentImage
  224. ? Colors.grey
  225. : Colors.blue,
  226. ),
  227. ),
  228. child: image,
  229. );
  230. },
  231. ),
  232. );
  233. }
  234. }