44 lines
1.8 KiB
Dart
44 lines
1.8 KiB
Dart
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);
|
||
}
|