import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'note_provider.dart'; /// 上次「回到前台对账」的时间,用来节流。 /// /// 切一次应用就刷三个接口太吵,30 秒内只对一次账。 DateTime? _lastResumeCheck; const _resumeThrottle = Duration(seconds: 30); /// App 重新回到前台时,对一次笔记数据的账。 /// /// 存在的理由:**在 Web 后台或另一台设备上改过笔记时,App 收不到任何通知** /// —— 不像 AI 那样有 SSE 的 tool 事件可听。而这个 App 里几个笔记相关的 /// provider 都因为「常驻页面」而不会被回收: /// /// · noteListProvider 是 keepAlive 的 Notifier(为保住搜索词和筛选) /// · noteOverviewProvider 被首页仪表盘的笔记卡片常驻监听 /// · 标签 / 目录计数 被笔记列表页监听 /// /// 不主动对账的话,它们会一直显示旧数据。表现很容易被误解成「缓存没刷」, /// 但其实是数据真的没重取过。 /// /// [force] 为 true 时跳过节流(重新进入页面用)。 void refreshNoteDataOnResume(WidgetRef ref, {bool force = false}) { if (!force) { final now = DateTime.now(); final last = _lastResumeCheck; if (last != null && now.difference(last) < _resumeThrottle) return; _lastResumeCheck = now; } // 列表走 refreshIfStale 而不是 invalidate: // invalidate 会重建 Notifier、丢掉搜索词和标签筛选 —— 那正是 keepAlive 要保的东西。 // 它自己还会判断「数据够不够新」,够新就什么都不做。 ref.read(noteListProvider.notifier).refreshIfStale(); // 这三个没有需要保留的状态,直接失效重取 ref.invalidate(noteOverviewProvider); ref.invalidate(noteTagsProvider); ref.invalidate(noteFolderTreeProvider); }