vehicle_info_page.dart 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. import 'package:cpt_form/modules/apply/vm/apply_view_model.dart';
  2. import 'package:cs_resources/generated/l10n.dart';
  3. import 'package:cs_resources/theme/app_colors_theme.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:auto_route/auto_route.dart';
  6. import 'package:flutter_hooks/flutter_hooks.dart';
  7. import 'package:hooks_riverpod/hooks_riverpod.dart';
  8. import 'package:router/ext/auto_router_extensions.dart';
  9. import 'package:widgets/ext/ex_widget.dart';
  10. import 'package:widgets/my_appbar.dart';
  11. import 'package:widgets/my_button.dart';
  12. import 'package:widgets/my_text_field.dart';
  13. import 'package:widgets/my_text_view.dart';
  14. import 'package:widgets/shatter/form_require_text.dart';
  15. import 'package:widgets/shatter/picker_container.dart';
  16. import 'package:widgets/widget_export.dart';
  17. import '../../router/page/form_page_router.dart';
  18. @RoutePage()
  19. class VehicleInfoPage extends HookConsumerWidget {
  20. const VehicleInfoPage({Key? key}) : super(key: key);
  21. //启动当前页面
  22. static void startInstance({BuildContext? context}) {
  23. if (context != null) {
  24. context.router.push(const VehicleInfoPageRoute());
  25. } else {
  26. appRouter.push(const VehicleInfoPageRoute());
  27. }
  28. }
  29. @override
  30. Widget build(BuildContext context, WidgetRef ref) {
  31. final viewModel = ref.watch(applyViewModelProvider.notifier);
  32. final state = ref.watch(applyViewModelProvider);
  33. // 使用 useState 来持久化 TextEditingController 和 FocusNode
  34. final TextEditingController vehicleNumController = useTextEditingController();
  35. final TextEditingController iuNumController = useTextEditingController();
  36. final TextEditingController vehicleInfoController = useTextEditingController();
  37. final FocusNode vehicleNumFocusNode = useFocusNode();
  38. final FocusNode iuNumFocusNode = useFocusNode();
  39. final FocusNode vehicleInfoFocusNode = useFocusNode();
  40. useEffect(() {
  41. //赋值State的值
  42. Future.microtask(() {});
  43. return () {
  44. // 释放控制器资源
  45. vehicleNumController.dispose();
  46. iuNumController.dispose();
  47. vehicleInfoController.dispose();
  48. vehicleNumFocusNode.dispose();
  49. iuNumFocusNode.dispose();
  50. vehicleInfoFocusNode.dispose();
  51. };
  52. }, []);
  53. return WillPopScope(
  54. child: Scaffold(
  55. appBar: MyAppBar.appBar(context, state.applyDetail?['title']),
  56. backgroundColor: context.appColors.backgroundWhite,
  57. body: Column(
  58. crossAxisAlignment: CrossAxisAlignment.start,
  59. children: [
  60. SingleChildScrollView(
  61. scrollDirection: Axis.vertical,
  62. physics: const BouncingScrollPhysics(),
  63. child: Container(
  64. width: double.infinity,
  65. child: Column(
  66. mainAxisSize: MainAxisSize.max,
  67. crossAxisAlignment: CrossAxisAlignment.start,
  68. children: [
  69. //下拉选 - Type类型
  70. MyTextView(
  71. S.current.type_of_application,
  72. fontSize: 17,
  73. marginTop: 30,
  74. marginLeft: 15,
  75. marginBottom: 16,
  76. isFontMedium: true,
  77. textColor: context.appColors.textBlack,
  78. ),
  79. PickerContainer(
  80. hint: S.current.choose_an_option,
  81. onClick: viewModel.pickOption,
  82. ).marginOnly(left: 15, right: 15),
  83. //下拉选 - 所有权状态
  84. MyTextView(
  85. S.current.ownership_status,
  86. fontSize: 17,
  87. marginTop: 14,
  88. marginLeft: 15,
  89. marginBottom: 16,
  90. isFontMedium: true,
  91. textColor: context.appColors.textBlack,
  92. ),
  93. PickerContainer(
  94. hint: S.current.choose_an_option,
  95. onClick: viewModel.pickOption,
  96. ).marginOnly(left: 15, right: 15),
  97. //输入框 - 车牌号
  98. FormRequireText(
  99. text: S.current.vehicle_number,
  100. textColor: context.appColors.textBlack,
  101. fontSize: 17,
  102. fontWeight: FontWeight.w500,
  103. ).marginOnly(top: 14,bottom: 16,left: 15,right: 15),
  104. // 表单
  105. _buildInputLayout(
  106. context,
  107. "vehicle_num",
  108. textInputType: TextInputType.text,
  109. textInputAction: TextInputAction.next,
  110. controller: vehicleNumController,
  111. focusNode: vehicleNumFocusNode,
  112. onSubmit: (formKey, value) {
  113. vehicleNumFocusNode.unfocus();
  114. FocusScope.of(context).requestFocus(iuNumFocusNode);
  115. },
  116. ),
  117. //输入框 - IU 号
  118. MyTextView(
  119. S.current.iu_number,
  120. fontSize: 17,
  121. marginTop: 14,
  122. marginLeft: 15,
  123. marginRight: 15,
  124. marginBottom: 16,
  125. isFontMedium: true,
  126. textColor: context.appColors.textBlack,
  127. ),
  128. // 表单
  129. _buildInputLayout(
  130. context,
  131. "iu_num",
  132. textInputType: TextInputType.text,
  133. textInputAction: TextInputAction.next,
  134. controller: iuNumController,
  135. focusNode: iuNumFocusNode,
  136. onSubmit: (formKey, value) {
  137. iuNumFocusNode.unfocus();
  138. FocusScope.of(context).requestFocus(vehicleInfoFocusNode);
  139. },
  140. ),
  141. //输入框 - 车辆信息
  142. FormRequireText(
  143. text: S.current.vehicle_make_model_colour,
  144. textColor: context.appColors.textBlack,
  145. fontSize: 17,
  146. fontWeight: FontWeight.w500,
  147. ).marginOnly(top: 14,bottom: 16,left: 15,right: 15),
  148. // 表单
  149. _buildInputLayout(
  150. context,
  151. "vehicle_info",
  152. textInputType: TextInputType.text,
  153. textInputAction: TextInputAction.done,
  154. controller: vehicleInfoController,
  155. focusNode: vehicleInfoFocusNode,
  156. onSubmit: (formKey, value) {
  157. vehicleInfoFocusNode.unfocus();
  158. },
  159. ),
  160. ],
  161. ),
  162. ),
  163. ).expanded(),
  164. //底部按钮
  165. MyButton(
  166. onPressed: (){
  167. vehicleNumFocusNode.unfocus();
  168. iuNumFocusNode.unfocus();
  169. vehicleInfoFocusNode.unfocus();
  170. viewModel.gotoNextPage();
  171. },
  172. text: S.current.next,
  173. textColor: Colors.white,
  174. backgroundColor: context.appColors.btnBgDefault,
  175. fontWeight: FontWeight.w500,
  176. type: ClickType.throttle,
  177. fontSize: 16,
  178. minHeight: 50,
  179. radius: 0,
  180. ),
  181. ],
  182. )),
  183. onWillPop: () async {
  184. viewModel.handlePopAction();
  185. return true;
  186. });
  187. }
  188. Widget _buildInputLayout(
  189. BuildContext context,
  190. String key, {
  191. double marginTop = 0,
  192. bool? showRightIcon = false, //是否展示右侧的布局
  193. Widget? rightWidget, //右侧的布局
  194. TextInputType textInputType = TextInputType.text,
  195. String? errorText,
  196. bool obscureText = false,
  197. required TextEditingController controller,
  198. required FocusNode focusNode,
  199. bool enable = true,
  200. TextInputAction textInputAction = TextInputAction.done,
  201. Function? onSubmit,
  202. }) {
  203. return IgnoreKeyboardDismiss(
  204. child: MyTextField(
  205. key,
  206. fillBackgroundColor: context.appColors.authFiledBG,
  207. "",
  208. hintStyle: TextStyle(
  209. color: context.appColors.authFiledHint,
  210. fontSize: 16.0,
  211. fontWeight: FontWeight.w500,
  212. ),
  213. controller: controller,
  214. focusNode: focusNode,
  215. margin: EdgeInsets.only(top: marginTop,left: 15,right: 15),
  216. padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
  217. showDivider: false,
  218. height: 44,
  219. enabled: enable,
  220. style: TextStyle(
  221. color: context.appColors.authFiledText,
  222. fontSize: 16.0,
  223. fontWeight: FontWeight.w500,
  224. ),
  225. inputType: textInputType,
  226. textInputAction: textInputAction,
  227. onSubmit: onSubmit,
  228. cursorColor: context.appColors.authFiledText,
  229. obscureText: obscureText,
  230. errorText: errorText,
  231. showLeftIcon: true,
  232. showRightIcon: showRightIcon,
  233. rightWidget: rightWidget,
  234. ),
  235. );
  236. }
  237. }