view.dart 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import 'package:electronic_assistant/base/base_page.dart';
  2. import 'package:electronic_assistant/data/bean/template_bean.dart';
  3. import 'package:electronic_assistant/resource/colors.gen.dart';
  4. import 'package:electronic_assistant/resource/string.gen.dart';
  5. import 'package:electronic_assistant/utils/expand.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:flutter/services.dart';
  8. import 'package:flutter/src/widgets/framework.dart';
  9. import 'package:flutter_screenutil/flutter_screenutil.dart';
  10. import 'package:get/get.dart';
  11. import '../../../resource/assets.gen.dart';
  12. import '../../../router/app_pages.dart';
  13. import '../../../utils/common_style.dart';
  14. import 'controller.dart';
  15. class TemplateEditPage extends BasePage<TemplateEditController> {
  16. const TemplateEditPage({super.key});
  17. static Future<T?>? addStart<T>() {
  18. return Get.toNamed<T>(RoutePath.templateEdit);
  19. }
  20. static void updateDetail(TemplateBean bean) {
  21. Get.toNamed(RoutePath.templateEdit, arguments: bean);
  22. }
  23. @override
  24. bool immersive() {
  25. return true;
  26. }
  27. @override
  28. Widget buildBody(BuildContext context) {
  29. return Scaffold(
  30. resizeToAvoidBottomInset: false,
  31. backgroundColor: 'F6F6F6'.color,
  32. appBar: _buildAppBar(),
  33. body: Column(
  34. children: [
  35. Expanded(child: _buildTemplateContent()),
  36. _buildTemplateBtn()
  37. ],
  38. ),
  39. );
  40. }
  41. Widget _buildTemplateContent() {
  42. return SingleChildScrollView(
  43. padding: EdgeInsets.symmetric(horizontal: 12.w),
  44. child: SizedBox(
  45. width: double.infinity,
  46. child:
  47. Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
  48. SizedBox(height: 12.h),
  49. Text(StringName.templateEditName.tr,
  50. style: TextStyle(
  51. fontSize: 14.sp, color: ColorName.secondaryTextColor)),
  52. SizedBox(height: 8.h),
  53. _buildTemplateTitle(),
  54. SizedBox(height: 20.h),
  55. Text(StringName.templateEditTitle.tr,
  56. style: TextStyle(
  57. fontSize: 14.sp, color: ColorName.secondaryTextColor)),
  58. Text(StringName.templateEditTitleHint.tr,
  59. style: TextStyle(
  60. fontSize: 12.sp, color: ColorName.tertiaryTextColor)),
  61. SizedBox(height: 12.h),
  62. _buildTemplateTitleList(),
  63. _buildDefaultTemplate(),
  64. _buildAddTemplate()
  65. ]),
  66. ));
  67. }
  68. Widget _buildAddTemplate() {
  69. return GestureDetector(
  70. onTap: () {
  71. controller.onAddTemplate();
  72. },
  73. child: Container(
  74. margin: EdgeInsets.only(bottom: 8.w),
  75. decoration: BoxDecoration(
  76. color: '#F0F0F0'.color, borderRadius: BorderRadius.circular(8.w)),
  77. child: Row(
  78. children: [
  79. SizedBox(width: 15.w),
  80. Assets.images.iconTemplateAddTitle.image(width: 28.w, height: 28.w),
  81. SizedBox(width: 10.w),
  82. Padding(
  83. padding: EdgeInsets.symmetric(vertical: 17.w),
  84. child: Text(StringName.templateEditTitleTxt.tr,
  85. style: TextStyle(
  86. fontSize: 15.sp, color: ColorName.tertiaryTextColor)),
  87. )
  88. ],
  89. ),
  90. ),
  91. );
  92. }
  93. Widget _buildDefaultTemplate() {
  94. return Obx(() {
  95. if (controller.defaultTemplate?.isNotEmpty == true) {
  96. return _templateItem(controller.defaultTemplate!, hideDeleteIcon: true);
  97. } else {
  98. return Container();
  99. }
  100. });
  101. }
  102. Widget _buildTemplateTitleList() {
  103. return Obx(() {
  104. return ListView.builder(
  105. physics: const NeverScrollableScrollPhysics(),
  106. itemBuilder: (context, index) {
  107. var item = controller.templateCustomTitle[index];
  108. return _templateItem(item, itemClick: () {
  109. controller.onUpdateTemplate(index, item);
  110. }, deleteClick: () {
  111. controller.onDeleteTemplate(index);
  112. });
  113. },
  114. itemCount: controller.templateCustomTitle.length,
  115. reverse: true,
  116. shrinkWrap: true);
  117. });
  118. }
  119. Widget _templateItem(String title,
  120. {bool? hideDeleteIcon,
  121. VoidCallback? itemClick,
  122. VoidCallback? deleteClick}) {
  123. return GestureDetector(
  124. onTap: itemClick,
  125. child: Container(
  126. margin: EdgeInsets.only(bottom: 8.w),
  127. decoration: BoxDecoration(
  128. color: ColorName.white, borderRadius: BorderRadius.circular(8.w)),
  129. padding: EdgeInsets.symmetric(horizontal: 14.w),
  130. child: Row(
  131. children: [
  132. Padding(
  133. padding: EdgeInsets.symmetric(vertical: 17.w),
  134. child: Text(title,
  135. style: TextStyle(
  136. fontSize: 15.sp, color: ColorName.primaryTextColor)),
  137. ),
  138. SizedBox(width: 14.w),
  139. const Spacer(),
  140. GestureDetector(
  141. onTap: deleteClick,
  142. child: Visibility(
  143. visible: hideDeleteIcon != true,
  144. child: Assets.images.iconRenameClearTxt
  145. .image(width: 20.w, height: 20.w)),
  146. )
  147. ],
  148. )),
  149. );
  150. }
  151. Widget _buildTemplateTitle() {
  152. return Container(
  153. width: double.infinity,
  154. decoration: BoxDecoration(
  155. color: ColorName.white, borderRadius: BorderRadius.circular(8.w)),
  156. child: TextField(
  157. focusNode: controller.focusNode,
  158. controller: controller.titleController,
  159. maxLength: 6,
  160. decoration: InputDecoration(
  161. counterText: '',
  162. contentPadding:
  163. EdgeInsets.symmetric(horizontal: 14.w, vertical: 20.w),
  164. border: const OutlineInputBorder(borderSide: BorderSide.none),
  165. hintStyle: TextStyle(
  166. height: 1, fontSize: 20.sp, color: ColorName.tertiaryTextColor),
  167. hintText: StringName.templateEditNameHint.tr,
  168. ),
  169. style: TextStyle(
  170. height: 1, fontSize: 20.sp, color: ColorName.primaryTextColor)),
  171. );
  172. }
  173. Widget _buildTemplateBtn() {
  174. return GestureDetector(
  175. onTap: () {
  176. controller.onSaveTemplate();
  177. },
  178. child: Center(
  179. child: Container(
  180. margin: EdgeInsets.only(bottom: 16.w),
  181. decoration: getCommonDecoration(8.w),
  182. width: 328.w,
  183. height: 48.w,
  184. child: Center(
  185. child: Text(
  186. StringName.templateEditSave.tr,
  187. style: TextStyle(fontSize: 16.sp, color: ColorName.white),
  188. ),
  189. ),
  190. ),
  191. ),
  192. );
  193. }
  194. AppBar _buildAppBar() {
  195. return AppBar(
  196. scrolledUnderElevation: 0,
  197. systemOverlayStyle: SystemUiOverlayStyle.dark,
  198. backgroundColor: Colors.transparent,
  199. title: Text(
  200. StringName.templateAddTitle.tr,
  201. style: TextStyle(fontSize: 17.sp, color: ColorName.primaryTextColor),
  202. ),
  203. actions: [
  204. GestureDetector(
  205. onTap: () {
  206. controller.onCancel();
  207. },
  208. child: Text(
  209. StringName.cancel.tr,
  210. style:
  211. TextStyle(fontSize: 15.sp, color: ColorName.secondaryTextColor),
  212. ),
  213. ),
  214. SizedBox(width: 12.w)
  215. ],
  216. centerTitle: true,
  217. leading: IconButton(
  218. onPressed: () {
  219. controller.onBack();
  220. },
  221. icon: SizedBox(
  222. width: 24.w,
  223. height: 24.w,
  224. child: Assets.images.iconBack.image())),
  225. );
  226. }
  227. }