flutter 实现表单的封装包含下拉框和输入框

一、表单封装组件实现效果

在这里插入图片描述

//表单组件
Widget buildFormWidget(List<InputModel> formList,{required GlobalKey<FormState> formKey}) {return Form(key: formKey,child: Column(children: formList.map((item) {return Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Row(children: [item.isRequired? Icon(Icons.star,size: 10,color: Theme.of(Get.context!).colorScheme.error): SizedBox(),Text(item.label,style:Theme.of(Get.context!).inputDecorationTheme.labelStyle,)],),SizedBox(height: 16,),GestureDetector(onTap: item.type == 'select'? () {showBottomSheet(item.bottomSheetList!, item.label,selectProp: item.selectProp,selectController: item.selectController,controller: item.controller);}: null,child: TextFormField(controller: item.controller,enabled: item.type == 'text',keyboardType: item.keyboardType,validator: (value) {// 添加表单验证if (item.isRequired && (value == null || value.isEmpty)) {return '请${item.type == 'select' ? '选择' : '输入'}${item.label}';}//正则表达式验证if (item.pattern.isEmpty &&(value == null || value.isEmpty)) {RegExp regex = RegExp(item.pattern);if (!regex.hasMatch(value!)) {return '请输入正确的${item.label}';}}return null;},decoration: InputDecoration(suffixIcon: item.type == 'select'? Icon(Icons.arrow_forward_ios,color: Color(0x6615171E)): null,focusedBorder: Theme.of(Get.context!).inputDecorationTheme.focusedBorder,disabledBorder: Theme.of(Get.context!).inputDecorationTheme.disabledBorder,enabledBorder: Theme.of(Get.context!).inputDecorationTheme.enabledBorder,errorBorder:Theme.of(Get.context!).inputDecorationTheme.errorBorder,errorStyle:Theme.of(Get.context!).inputDecorationTheme.errorStyle,hintText:'请${item.type == 'select' ? '选择' : '输入'}${item.label}',isDense: true,filled: true,fillColor:Theme.of(Get.context!).inputDecorationTheme.fillColor,),),),SizedBox(height: 16,),],);}).toList(),));
}//bottomSheet
void showBottomSheet(List<Map<String, dynamic>> list, String title,{Map? selectProp,RxMap<String, dynamic>? selectController,TextEditingController? controller}) {showGenderPanel(title,buildCheckList(list, (item) {controller?.text = item[selectProp?['label']];Get.back();}, props: selectProp, selected: selectController));
}// 底部弹出层
void showGenderPanel(String title, Widget sheetContent) {showModalBottomSheet(context: Get.context!,builder: (context) {return Container(height: 800,child: Column(children: [Container(// height: 100,padding: Theme.of(Get.context!).dialogTheme.actionsPadding,child: Stack(children: [Row(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text(title,overflow: TextOverflow.ellipsis, // 显示省略号style: Theme.of(Get.context!).dialogTheme.titleTextStyle,),],),Positioned(right: 20,// top: 14,child: GestureDetector(onTap: () {Navigator.pop(context);},child: Icon(Icons.cancel_outlined,color: Theme.of(Get.context!).dialogTheme.iconColor),),),],)),Divider(height: 1,// color: Theme.of(Get.context!).dividerColor,),Container(// padding: EdgeInsets.all(16),child: sheetContent,)],));});
}//单选列表
Widget buildCheckList(List<Map<String, dynamic>> list, Function? onChanged,{Map? props, RxMap<String, dynamic>? selected}) {props ??= {'label': 'label', 'value': 'value'};String label = props['label'] ?? 'label';String value = props['value'] ?? 'value';return Obx(() => Container(width: Get.width,child: Column(children: list.asMap().entries.map((entry) {int index = entry.key;dynamic item = entry.value;print('渲染');return Column(children: [GestureDetector(onTap: () {selected?.value = item;if (onChanged != null) {onChanged(item);}},child: Container(width: Get.width,decoration: BoxDecoration(color: Colors.blue.withOpacity(0),),padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 16),child: Row(children: [Icon((selected?.value[value] ?? '') == item[value]? Icons.check_circle: Icons.circle_outlined,size: 22,color: (selected?.value[value] ?? '') == item[value]? Color.fromRGBO(50, 73, 223, 1): Color.fromRGBO(21, 23, 30, 0.40)),SizedBox(width: 6),Text(item[label],style: TextStyle(fontSize: 16,),),],),)),Divider(height: 1,color: index + 1 == list.length? Color.fromRGBO(128, 130, 145, 0): Color.fromRGBO(128, 130, 145, 0.20),),],);}).toList(),)));
}

二、调用方法:

 buildFormWidget(formList, formKey: formKey),

三、数据格式:

Map<String, dynamic> controllers = {'phone': TextEditingController(text: '仓库1'),'phoneSelect': <String, dynamic>{'id': '18', 'name': '仓库1'}.obs,'code': TextEditingController(text: '123'),};formList = [InputModel(label: '入库仓库',isRequired: true,type: 'select',controller: controllers['phone'],selectController: controllers['phoneSelect'],bottomSheetList: bottomSheetList,selectProp: {'label': 'name', 'value': 'id'}),InputModel(label: '入库数量',isRequired: true,keyboardType: TextInputType.number,controller: controllers['code']),];

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/637225.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis-cluster集群架构

一、集群架构 上述集群架构师一个由多个主从节点群组成的分布式服务器&#xff0c;具有复制、高可用和分片的特性。Redis集群不需要sentine哨兵也能完成节点移除和故障转移。官方文档称可以扩展上万个节点。推荐不超过1000个&#xff1b;从节点只担任备份的角色&#xff0c;不承…

使用JavaScript收集和发送用户设备信息,后端使用php将数据保存在本地json,便于后期分析数据

js代码部分 <script> // 之前提供的JavaScript代码 fetch(https://api.ipify.org?formatjson).then(response > response.json()).then(data > {const deviceInfo {userAgent: navigator.userAgent,platform: navigator.platform,language: navigator.language,…

Java:String类

目录 1.String类的重要性2.String对象的比较2.1 比较是否引用同一个对象2.2 boolean equals(Object anObject) 方法&#xff1a;按照字典序比较2.3int compareTo(String s)方法: 按照字典序进行比较2.4 boolean equalsIgnoreCase(Object anObject)方法&#xff1a;忽略大小写的…

面试高频:HTTPS 通信流程

更多大厂面试内容可见 -> http://11come.cn 面试高频&#xff1a;HTTPS 通信流程 HTTPS 的加密流程 接下来说一下 HTTPS 协议是如何进行通信的&#xff1a; HTTPS 通信使用的 对称加密 非对称加密 两者结合的算法 HTTPS 通信时&#xff0c;会先使用 非对称加密 让通信双…

2022 E3 算法题第三题(Fair Count)

题目内容 You are given two arrays A and B consisting of N integers each. Index K is named fair if the four sums (A[0] ... A[K-1]), (A[K] ... A[N-1]), (B[0] ... B[K-1]) and (B[K] ... B[N-1]) are all equal. In other words, K is the index where the two a…

C#基础|string字符串的应用方法总结

哈喽,你好啊,我是雷工! 今天学了下关于C#string字符串的常用方法,以下为学习笔记。 01、字符串处理场景1 用邮箱注册账号时 A1、判断用户输入的邮箱是否包含“@”; A2、找到第一个匹配项所在的位置; A3、如果找到则为索引位置,否则为-1; 示例代码: static void Mai…

SQLite导出数据库至sql文件

SQLite是一款实现了自包含、无服务器、零配置、事务性SQL数据库引擎的软件库。SQLite是世界上部署最广泛的SQL数据库引擎。 SQLite 是非常小的&#xff0c;是轻量级的&#xff0c;完全配置时小于 400KiB&#xff0c;省略可选功能配置时小于250KiB。 SQLite 源代码不受版权限制。…

补档 -- 测试的分类(1)

最近有很多人私信我说: 灰灰你什么时候写测试分类阿, 本来我要开始肝性能测试的, 我一看, 奥, 之前摸鱼忘写了, 所以这里补档(叶问指着一边笑.jpg). 总览 标红的需要注意一下. 为什么要对软件测试进行分类? 软件测试是软件生命周期的一个重要环节, 具有较高的复杂性, 对于软…

C语言-字符函数与字符串函数

在C语言中&#xff0c;我们经常要对字符或是字符串进行各种操作。那C语言究竟给了我们哪些方法呢&#xff0c;本篇文章就是让大家了解对字符和字符串处理相关的知识。 目录 1.字符函数 1.1字符分类函数 1.2字符转换函数 2.字符串函数 2.1strlen函数的使用和模拟实现 2.2…

数电期末复习(二)逻辑代数基础

这里写目录标题 2.1 二值逻辑变量与基本逻辑运算2.1.1 与运算2.1.2 或运算2.1.3 非运算2.1.4 常用复合逻辑运算 2.2 逻辑函数的建立及其表示方法2.2.1 真值表表示2.2.2 逻辑函数表达式表示2.2.3 逻辑图表示方法2.2.4 波形图表示方法 2.3 逻辑代数2.3.1 逻辑代数的基本定律和恒等…

磁盘的管理

会在linux中使用硬盘 分区 格式化&#xff08;重新安装文件系统&#xff09; 挂载 硬盘的分类 1.机械硬盘 2.固态硬盘 硬盘的数据结构 扇区&#xff1a;盘片被分为多个扇形区域&#xff0c;每个扇区存放512字节的 数据 &#xff08;扇区越多容量越大&#xff09; 存放数据的…

开启智慧之旅,AI与机器学习驱动的微服务设计模式探索

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;开启智慧…