Flutter中TextField向sqflite插入数据生成多行而非单行的问题求助
问题根源
你当前的代码会生成三条独立记录,核心原因是在_onSubmitted方法中连续三次调用了widget.onSubmitted,每次单独传入一个字段值。这相当于触发三次sqflite插入操作,自然会生成三条记录,而非合并成一条。
解决方案
需要将三个字段打包成一个整体(Map或自定义模型类),一次性传给widget.onSubmitted,再在父组件中执行单条记录的插入操作。
方式1:使用Map打包字段
1. 修改_onSubmitted方法
将三个字段合并为一个Map,只调用一次widget.onSubmitted:
void _onSubmitted(String text, String qnt, String um) { if (text.isEmpty || qnt.isEmpty || um.isEmpty) return; // 把三个字段打包成一个Map widget.onSubmitted({ 'name': text, 'qnt': qnt, 'um': um, }); _controller.clear(); _controller1.clear(); _controller2.clear(); _focusNode.requestFocus(); }
2. 父组件中处理插入
确保父组件的onSubmitted回调接收Map,并执行单条插入:
// 父组件中的回调示例 Future<void> handleSubmitted(Map<String, String> itemData) async { await yourDatabase.insert( 'your_table_name', // 替换为你的表名 itemData, conflictAlgorithm: ConflictAlgorithm.replace, ); }
方式2:使用自定义模型类(更规范)
1. 定义Item模型类
先创建一个对应表结构的模型类,方便数据管理:
class Item { final String name; final String qnt; final String um; Item({required this.name, required this.qnt, required this.um}); // 转换为sqflite可识别的Map格式 Map<String, dynamic> toMap() { return { 'name': name, 'qnt': qnt, 'um': um, }; } }
2. 修改_onSubmitted方法
创建Item实例并传递给回调:
void _onSubmitted(String text, String qnt, String um) { if (text.isEmpty || qnt.isEmpty || um.isEmpty) return; final newItem = Item(name: text, qnt: qnt, um: um); widget.onSubmitted(newItem); _controller.clear(); _controller1.clear(); _controller2.clear(); _focusNode.requestFocus(); }
3. 父组件中处理插入
接收Item实例并转换为Map插入:
// 父组件中的回调示例 Future<void> handleSubmitted(Item item) async { await yourDatabase.insert( 'your_table_name', // 替换为你的表名 item.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, ); }
完成以上修改后,三个TextField的内容就会被合并成一条记录插入sqflite,后续显示Text(item.name + item.qnt + item.um)就能得到期望的"1 2 3"效果。
内容的提问来源于stack exchange,提问作者VirtualArs
相关产品推荐
相关产品推荐

