form_view.dart 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import 'dart:convert';
  2. import 'package:fis_common/index.dart';
  3. import 'package:flutter/foundation.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter/services.dart';
  6. import 'package:get/get.dart';
  7. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  8. import 'package:vitalapp/managers/interfaces/doctor.dart';
  9. import 'package:vitalapp/pages/check/models/form.dart';
  10. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_blood.dart';
  11. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_check_box.dart';
  12. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_date.dart';
  13. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_input.dart';
  14. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_multi_select_list.dart';
  15. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_number_input.dart';
  16. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_radio.dart';
  17. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_signature.dart';
  18. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_single_option.dart';
  19. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_single_select.dart';
  20. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_text_input.dart';
  21. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_virtual_title.dart';
  22. import 'package:vitalapp/store/store.dart';
  23. import '../medical/widgets/exam_card.dart';
  24. import 'form_info.dart';
  25. class FormView extends StatefulWidget {
  26. final String templateJson;
  27. FormView(this.templateJson);
  28. @override
  29. State<StatefulWidget> createState() {
  30. return FormViewState();
  31. }
  32. }
  33. class FormViewState extends State<FormView> {
  34. final ScrollController _scrollController = ScrollController();
  35. List<FormObject> _templateItems = [];
  36. @override
  37. void initState() {
  38. var _templateJson = widget.templateJson;
  39. var templateItems = jsonDecode(_templateJson);
  40. for (var item in templateItems) {
  41. if (item is Map<String, dynamic> && item.containsKey('type')) {
  42. try {
  43. var templateItem = FormObject.fromJson(item);
  44. _templateItems.add(templateItem);
  45. } catch (e) {
  46. print(e);
  47. }
  48. }
  49. }
  50. super.initState();
  51. }
  52. @override
  53. Widget build(BuildContext context) {
  54. return Scrollbar(
  55. thumbVisibility: true,
  56. controller: _scrollController,
  57. child: SingleChildScrollView(
  58. controller: _scrollController,
  59. child: Container(
  60. alignment: Alignment.topCenter,
  61. padding: const EdgeInsets.all(15),
  62. child: FormItemsView(_templateItems),
  63. ),
  64. ),
  65. );
  66. }
  67. }
  68. class FormItemsView extends StatelessWidget {
  69. final List<FormObject> templateItems;
  70. FormItemsView(this.templateItems);
  71. @override
  72. Widget build(BuildContext context) {
  73. return LayoutBuilder(
  74. builder: (BuildContext context, BoxConstraints constraints) {
  75. return Wrap(
  76. runSpacing: 20, // 纵向元素间距
  77. alignment: WrapAlignment.start,
  78. children: templateItems.map(
  79. (e) {
  80. switch (e.type) {
  81. case "dateTime":
  82. return Container(
  83. width: constraints.maxWidth / 2,
  84. child: ExamDate(currentFormObject: e),
  85. );
  86. case "longInput":
  87. var width = constraints.maxWidth;
  88. return Container(
  89. width: width,
  90. child: ExamTextInput(
  91. currentFormObject: e,
  92. ),
  93. );
  94. case "input":
  95. var width = constraints.maxWidth / 2;
  96. if ((e.label?.length ?? 0) > 15) {
  97. width = constraints.maxWidth;
  98. }
  99. return Container(
  100. width: width,
  101. child: ExamTextInput(
  102. currentFormObject: e,
  103. ),
  104. );
  105. case "textareaInput":
  106. return Container(
  107. height: 200,
  108. child: ExamTextInput(
  109. currentFormObject: e,
  110. ),
  111. );
  112. case "numberInput":
  113. return Container(
  114. width: constraints.maxWidth / 2,
  115. child: ExamTextInput(
  116. currentFormObject: e,
  117. isNumber: true,
  118. ),
  119. );
  120. case "checkbox":
  121. List<Option> options = e.options ?? [];
  122. return ExammultiSelectList(
  123. currentFormObject: e,
  124. currentSelectedCheckBox: [],
  125. options: options,
  126. );
  127. case "option":
  128. return ExamSingleOption(
  129. option: Option(label: e.label, value: e.key),
  130. currentFormObject: e,
  131. isSelected: false,
  132. );
  133. case "radio":
  134. List<Option> options = e.options ?? [];
  135. return ExamSingleSelect(
  136. options: options,
  137. currentFormObject: e,
  138. currentSelected: "",
  139. );
  140. case "virtualTitle":
  141. return VirtualTitleContent(
  142. formObject: e,
  143. );
  144. case "signature":
  145. return Container(
  146. width: constraints.maxWidth / 2,
  147. child: Signature(e),
  148. );
  149. case "bloodPressure":
  150. return Container(
  151. width: constraints.maxWidth / 2,
  152. child: ExamBlood(
  153. currentFormObject: e,
  154. ),
  155. );
  156. case "label":
  157. return ExamCard(
  158. content: Container(),
  159. title: e.label,
  160. );
  161. }
  162. if (kDebugMode) {
  163. return Text("存在异常组件:$e");
  164. }
  165. return SizedBox();
  166. },
  167. ).toList(),
  168. );
  169. });
  170. }
  171. }