如何保留TextField中已输入的值 基于sqflite数据库存储场景
保留TextField已输入值的实现方案
核心逻辑:你目前只完成了「把TextField输入值写入sqflite数据库」的流程,要保留输入值分两种场景处理:
- 场景1:点击保存按钮后,当前页不跳转的前提下保留输入值
你现有代码不需要做大调整,只要不在onPressed回调的末尾执行_datecontroller.clear()、_datecontroller1.clear()、_quantitecontroller.clear()这类清空控制器的操作,输入框里的内容会默认保留。注意你注释掉的setState不影响输入值留存,只有需要同步刷新页面其他关联状态时再放开即可。 - 场景2:退出页面再重新进入、或者页面重建(如横竖屏切换)时保留之前输入的值
需要补充「页面初始化时从sqflite读取已存数据,回写到TextField对应的控制器」的逻辑,具体实现如下:
- 首先确保你的三个输入控制器
_datecontroller、_datecontroller1、_quantitecontroller是在State类中初始化,不要放在build方法里,避免每次页面重建都生成新的控制器导致值丢失,示例:
class _YourPageState extends State<YourPage> { // 控制器在State类中定义初始化 final _datecontroller = TextEditingController(); final _datecontroller1 = TextEditingController(); final _quantitecontroller = TextEditingController(); @override void initState() { super.initState(); // 页面初始化时加载已存的数据 _loadSavedTodoData(); } // 从sqflite查询已存数据,回写到控制器 _loadSavedTodoData() async { var _todoService = TodoService(); // 按你的业务逻辑查询对应的数据,比如查最新保存的todo、或者指定id的todo Todo? savedTodo = await _todoService.getLatestTodo(); if (savedTodo != null) { _datecontroller.text = savedTodo.datedebut ?? ''; _datecontroller1.text = savedTodo.datefin ?? ''; _quantitecontroller.text = savedTodo.quantite ?? ''; // 刷新页面渲染输入值 setState(() {}); } } // 你的build方法、其他逻辑省略 @override void dispose() { // 页面销毁时释放控制器,规范写法 _datecontroller.dispose(); _datecontroller1.dispose(); _quantitecontroller.dispose(); super.dispose(); } }
- 你现有保存按钮的代码可以保留,不需要调整,已经能正确把输入值写入数据库。
内容的提问来源于stack exchange,提问作者Nina
相关产品推荐
相关产品推荐

