announcement_popup_provider.dart 1.4 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import 'package:shared_preferences/shared_preferences.dart';
  3. import '../core/network/dio_client.dart';
  4. import '../data/models/announcement/announcement.dart';
  5. import '../data/services/announcement_service.dart';
  6. const _kShownPopupIdsKey = 'announcement_popup_shown_ids';
  7. /// 系统弹窗公告 Provider — 返回尚未展示过的弹窗公告列表(按发布时间从近到远)
  8. final announcementPopupProvider =
  9. FutureProvider.autoDispose<List<AnnouncementBean>>((ref) async {
  10. final dio = ref.read(dioClientProvider);
  11. final beans = await AnnouncementService(dio).getPopupAnnouncements();
  12. if (beans.isEmpty) return [];
  13. final prefs = await SharedPreferences.getInstance();
  14. final shownIds = prefs.getStringList(_kShownPopupIdsKey) ?? [];
  15. return beans
  16. .where((b) => b.isShow && b.id.isNotEmpty && !shownIds.contains(b.id))
  17. .toList();
  18. });
  19. /// 标记弹窗已显示,记录 id(最多保留最近 100 条,防止无限增长)
  20. Future<void> markPopupShown(String id) async {
  21. final prefs = await SharedPreferences.getInstance();
  22. final shownIds = prefs.getStringList(_kShownPopupIdsKey) ?? [];
  23. if (!shownIds.contains(id)) {
  24. shownIds.add(id);
  25. if (shownIds.length > 100) {
  26. shownIds.removeRange(0, shownIds.length - 100);
  27. }
  28. await prefs.setStringList(_kShownPopupIdsKey, shownIds);
  29. }
  30. }