Flutter Syncfusion Calendar预约数据重复问题解决咨询
解决Flutter Syncfusion Calendar切换视图时日程重复添加的问题
问题原因
每次切换Calendar视图(尤其是日程视图)时,handleLoadMore方法会被重复触发,原代码每次都会全量查询数据库数据并添加到预约列表,导致重复数据堆积。
修复方案
通过添加加载状态标记,确保仅执行一次全量数据加载,具体步骤如下:
1. 在Calendar数据源类中添加加载状态标记
假设你的数据源类是继承自CalendarDataSource的_EventDataSource,添加布尔变量标记数据是否已加载:
class _EventDataSource extends CalendarDataSource { // 标记数据是否已完成加载 bool isDataLoaded = false; // 原有其他代码... }
2. 修改handleLoadMore函数,阻止重复加载
在函数开头检查加载状态,若已加载则直接返回;加载完成后标记状态为已加载:
Future<void> handleLoadMore(DateTime startDate, DateTime endDate) async { // 数据已加载则直接返回,避免重复查询添加 if (_events.isDataLoaded) return; await Future<void>.delayed(const Duration(seconds: 1)); final List<_Meeting> appointmentData = []; final prefs = await SharedPreferences.getInstance(); var int1 = await prefs.getInt('id'); final conn = await db.getConnection(); try { var result = await conn.query( 'SELECT kyttr FROM ${db_adi}.web_dis_fircalama where kytkll =? order by kyttr asc', [int1], ); notceklist = result.toList(); for(var i = 0; i < notceklist.length; i ++){ _Meeting meetingData = _Meeting( '${notceklist[i]['kyttr'].toString().split(' ')[1].substring(0,5)} Saatinde dişlerinizi fırçaladınız.', _convertDateFromString(notceklist[i]['kyttr'].toString()), _convertDateFromString(notceklist[i]['kyttr'].toString()), Colors.blue, true, ); appointmentData.add(meetingData); } appointments.addAll(appointmentData); notifyListeners(CalendarDataSourceAction.add, appointmentData); // 标记数据已完成加载 _events.isDataLoaded = true; } finally { // 确保数据库连接无论是否出错都会关闭 await conn.close(); } }
额外优化说明
- 将原代码的
then链式调用改为async/await,逻辑更清晰且便于错误处理 - 使用
try/finally保证数据库连接在操作完成后关闭,避免资源泄漏
扩展:支持增量加载(可选)
如果后续需要实现滚动加载新数据(而非一次性加载全部),可调整逻辑:
- 记录已加载数据的最大日期
- 在
handleLoadMore中仅查询该日期之后的新数据 - 更新已加载的最大日期,避免重复查询旧数据
内容的提问来源于stack exchange,提问作者alper
相关产品推荐
相关产品推荐

