Files

44 lines
1.8 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}