exam_body_temperature.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:vnote_device_plugin/consts/types.dart';
  4. import 'package:vnote_device_plugin/devices/temp.dart';
  5. import 'package:vitalapp/components/dialog_number.dart';
  6. import 'package:vitalapp/managers/interfaces/models/device.dart';
  7. import 'package:vitalapp/managers/interfaces/permission.dart';
  8. import 'package:vitalapp/pages/check/models/form.dart';
  9. import 'package:vitalapp/pages/check/widgets/device_controller.dart';
  10. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_card.dart';
  11. import 'package:vitalapp/pages/medical/models/worker.dart';
  12. import 'package:vitalapp/pages/medical/widgets/device_status.dart';
  13. // ignore: must_be_immutable
  14. class ExamBodyTemperature extends StatefulWidget {
  15. ExamBodyTemperature({
  16. super.key,
  17. required this.currentFormObject,
  18. required this.currentInputValue,
  19. this.bodyTemperatureInput,
  20. });
  21. FormObject currentFormObject;
  22. String currentInputValue;
  23. Function(String value)? bodyTemperatureInput;
  24. @override
  25. State<ExamBodyTemperature> createState() => _ExamBodyTemperatureState();
  26. }
  27. /// TODO 先完成配置设备的替换 还需要优化
  28. class _ExamBodyTemperatureState extends State<ExamBodyTemperature> {
  29. var permissionManager = Get.find<IPermissionManager>();
  30. final controller = Get.find<DeviceController>();
  31. WorkerStatus connectStatus = WorkerStatus.connecting;
  32. bool isAccessTypeAuth = false;
  33. late TempDeviceWorker worker;
  34. Future<void> currentDevice() async {
  35. DeviceModel? device = await controller.getDevice(DeviceTypes.TEMP);
  36. isAccessTypeAuth = await controller.isAccessTypeAuth(DeviceTypes.TEMP);
  37. if (device == null) {
  38. connectStatus = WorkerStatus.unboundDevice;
  39. return;
  40. }
  41. worker = TempDeviceWorker(
  42. model: device.model,
  43. mac: device.mac,
  44. );
  45. loadListeners();
  46. }
  47. @override
  48. void initState() {
  49. currentDevice();
  50. super.initState();
  51. }
  52. void loadListeners() {
  53. worker.successEvent.addListener(_onSuccess);
  54. worker.connectErrorEvent.addListener(_onConnectFail);
  55. worker.connectedEvent.addListener(_onConnectSuccess);
  56. worker.disconnectedEvent.addListener(_onDisconnected);
  57. worker.tempTooLowEvent.addListener(_onTempTooLowOrTooHeigh);
  58. worker.tempTooHighEvent.addListener(_onTempTooLowOrTooHeigh);
  59. worker.connect();
  60. }
  61. Future<void> disconnect() async {
  62. worker.connectErrorEvent.removeListener(_onConnectFail);
  63. worker.connectedEvent.removeListener(_onConnectSuccess);
  64. worker.successEvent.removeListener(_onSuccess);
  65. worker.disconnectedEvent.removeListener(_onDisconnected);
  66. worker.tempTooLowEvent.removeListener(_onTempTooLowOrTooHeigh);
  67. worker.tempTooHighEvent.removeListener(_onTempTooLowOrTooHeigh);
  68. await worker.disconnect();
  69. }
  70. @override
  71. void dispose() {
  72. disconnect();
  73. super.dispose();
  74. }
  75. void _onSuccess(_, double e) {
  76. setState(() {
  77. widget.currentInputValue = e.toString();
  78. widget.bodyTemperatureInput!.call(widget.currentInputValue);
  79. connectStatus = WorkerStatus.connected;
  80. });
  81. }
  82. void _onConnectFail(sender, e) {
  83. print('连接设备失败');
  84. connectStatus = WorkerStatus.connectionFailed;
  85. worker.connect();
  86. setState(() {});
  87. }
  88. void _onConnectSuccess(sender, e) {
  89. connectStatus = WorkerStatus.connected;
  90. setState(() {});
  91. }
  92. void _onTempTooLowOrTooHeigh(sender, e) {
  93. widget.currentInputValue = e.toString();
  94. widget.bodyTemperatureInput!.call(widget.currentInputValue);
  95. connectStatus = WorkerStatus.connected;
  96. setState(() {});
  97. }
  98. void _onDisconnected(sender, e) {
  99. connectStatus = WorkerStatus.disconnected;
  100. worker.connect();
  101. print('设备连接中断');
  102. setState(() {});
  103. }
  104. @override
  105. Widget build(BuildContext context) {
  106. return Stack(
  107. children: [
  108. _buildTemperature(),
  109. if (isAccessTypeAuth) DeviceStatus(connectStatus: connectStatus),
  110. ],
  111. );
  112. }
  113. Widget _buildTemperature() {
  114. return ExamCard(
  115. title: widget.currentFormObject.label ?? '',
  116. clickCard: () {
  117. _inputTemperature();
  118. },
  119. content: Container(
  120. alignment: Alignment.bottomRight,
  121. padding: const EdgeInsets.only(
  122. bottom: 20,
  123. right: 30,
  124. left: 40,
  125. ),
  126. constraints: const BoxConstraints(minHeight: 150),
  127. child: FittedBox(
  128. child: Row(
  129. mainAxisAlignment: MainAxisAlignment.end,
  130. crossAxisAlignment: CrossAxisAlignment.end,
  131. children: [
  132. RichText(
  133. text: TextSpan(
  134. text: widget.currentInputValue,
  135. style: const TextStyle(
  136. fontSize: 80,
  137. color: Colors.black,
  138. ),
  139. children: [
  140. TextSpan(
  141. text: widget.currentFormObject.append ?? '',
  142. style: const TextStyle(fontSize: 25),
  143. )
  144. ],
  145. ),
  146. ),
  147. ],
  148. ),
  149. ),
  150. ),
  151. );
  152. }
  153. Future<void> _inputTemperature() async {
  154. String? result = await VDialogNumber(
  155. title: widget.currentFormObject.label,
  156. initialValue: widget.currentInputValue,
  157. ).show();
  158. if (result?.isNotEmpty ?? false) {
  159. widget.currentInputValue = result ?? '';
  160. widget.bodyTemperatureInput!.call(widget.currentInputValue);
  161. }
  162. }
  163. }