coin_cache_provider.dart 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import 'package:flutter_cache_manager/flutter_cache_manager.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import '../core/network/dio_client.dart';
  4. import '../data/models/home/market_ticker.dart';
  5. import '../data/services/market_service.dart';
  6. /// 全局币对缓存 — 缓存 /swap/coin/enabled-list 返回的所有交易对信息
  7. /// 包含 icon、isHot 等静态字段,供首页、行情页等多处复用
  8. class CoinCacheNotifier extends Notifier<Map<String, MarketTicker>> {
  9. @override
  10. Map<String, MarketTicker> build() {
  11. Future.microtask(_load);
  12. return {};
  13. }
  14. Future<void> _load() async {
  15. try {
  16. final dio = ref.read(dioClientProvider);
  17. final coins = await MarketService(dio).getEnabledCoins();
  18. state = {for (final c in coins) c.symbol: c};
  19. // 预缓存所有币种图标,切换到行情页时直接命中缓存
  20. final cacheManager = DefaultCacheManager();
  21. for (final c in coins) {
  22. if (c.icon.isNotEmpty) {
  23. cacheManager.downloadFile(c.icon).ignore();
  24. }
  25. }
  26. } catch (_) {}
  27. }
  28. /// 刷新缓存
  29. Future<void> refresh() => _load();
  30. /// 根据 symbol 查找币对信息(icon 等)
  31. MarketTicker? getBySymbol(String symbol) => state[symbol];
  32. /// 将排行榜数据与缓存的币对信息合并(补充 icon、isHot)
  33. List<MarketTicker> mergeWithRank(List<MarketTicker> rankTickers) {
  34. return rankTickers.map((t) {
  35. final cached = state[t.symbol];
  36. if (cached == null) return t;
  37. return t.copyWith(
  38. icon: cached.icon,
  39. isHot: cached.isHot,
  40. baseAsset: cached.baseAsset.isNotEmpty ? cached.baseAsset : t.baseAsset,
  41. pricePrecision: cached.pricePrecision,
  42. );
  43. }).toList();
  44. }
  45. }
  46. final coinCacheProvider =
  47. NotifierProvider<CoinCacheNotifier, Map<String, MarketTicker>>(
  48. CoinCacheNotifier.new,
  49. );