Flutter中如何保存DateTimeField选中的日期时间并存储到数据库
解决方案
1. 定义变量接收选中的日期时间
首先在当前页面的State类中声明变量存储选中值,同时给DateTimeField增加onChanged回调,拿到选择器返回的最终值:
// 在State类中声明变量 DateTime? _selectedActnOn;
修改你的DateTimeField代码,新增onChanged属性:
Text('Action on (${format.pattern})'), DateTimeField( format: format, // 新增onChanged回调接收选中值 onChanged: (value) { setState(() { _selectedActnOn = value; }); }, onShowPicker: (context, currentValue) async { final date = await showDatePicker( context: context, firstDate: DateTime(1900), initialDate: currentValue ?? DateTime.now(), lastDate: DateTime(2100) ); if (date != null) { final time = await showTimePicker( context: context, initialTime: TimeOfDay.fromDateTime(currentValue ?? DateTime.now()), ); return DateTimeField.combine(date, time); } else { return currentValue; } }, ),
之后_selectedActnOn变量里就会存储你选中的日期时间值。
2. 转换为数据库可存储的格式
常见的移动端数据库(如sqflite)不直接支持DateTime类型存储,你可以任选以下两种方案适配note表的actn_on字段:
- 存为TEXT类型:将DateTime转为ISO8601格式字符串,可读性更高,代码为
_selectedActnOn?.toIso8601String() - 存为INTEGER类型:将DateTime转为毫秒级时间戳,数值排序、计算效率更高,代码为
_selectedActnOn?.millisecondsSinceEpoch
3. 写入到note表示例(以sqflite为例)
插入前建议先判断_selectedActnOn非空,避免写入空值到数据库,参考代码如下:
Future<void> insertNote() async { if (_selectedActnOn == null) return; // 先获取数据库实例 final db = await database; await db.insert( 'note', // 按你选的存储方式传值即可,这里以存ISO8601字符串为例 {'actn_on': _selectedActnOn?.toIso8601String() /* 其他字段的键值对 */}, ); }
读数据的时候反向转换即可:
- 存的是ISO8601字符串:
DateTime.parse(数据库读出的字符串) - 存的是时间戳:
DateTime.fromMillisecondsSinceEpoch(数据库读出的数值)
内容的提问来源于stack exchange,提问作者Fathima Shafana
相关产品推荐
相关产品推荐

