spot_symbol_cache_provider.dart 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import '../core/network/dio_client.dart';
  3. import '../data/services/spot_service.dart';
  4. /// 交易对精度配置(来自 spot/v1/config/symbol/list 的 pricePre/volumePre)
  5. class SpotSymbolPrecision {
  6. final String symbol; // 如 BTCUSDT
  7. final int pricePre; // 价格小数位
  8. final int volumePre; // 数量小数位
  9. const SpotSymbolPrecision({
  10. required this.symbol,
  11. this.pricePre = 2,
  12. this.volumePre = 4,
  13. });
  14. factory SpotSymbolPrecision.fromJson(Map<String, dynamic> json) {
  15. final symbol = (json['symbol'] as String? ?? '').toUpperCase();
  16. return SpotSymbolPrecision(
  17. symbol: symbol,
  18. pricePre: (json['pricePre'] as num?)?.toInt() ?? 2,
  19. volumePre: (json['volumePre'] as num?)?.toInt() ?? 4,
  20. );
  21. }
  22. }
  23. /// 全局现货交易对精度缓存 — 键为大写 symbol(如 "BTCUSDT")
  24. class SpotSymbolCacheNotifier
  25. extends Notifier<Map<String, SpotSymbolPrecision>> {
  26. @override
  27. Map<String, SpotSymbolPrecision> build() {
  28. Future.microtask(_load);
  29. return {};
  30. }
  31. Future<void> _load() async {
  32. try {
  33. final dio = ref.read(dioClientProvider);
  34. final list = await SpotService(dio).getSymbols();
  35. final map = <String, SpotSymbolPrecision>{};
  36. for (final json in list) {
  37. final p = SpotSymbolPrecision.fromJson(json);
  38. if (p.symbol.isNotEmpty) map[p.symbol] = p;
  39. }
  40. state = map;
  41. } catch (_) {}
  42. }
  43. Future<void> refresh() => _load();
  44. }
  45. final spotSymbolCacheProvider =
  46. NotifierProvider<SpotSymbolCacheNotifier, Map<String, SpotSymbolPrecision>>(
  47. SpotSymbolCacheNotifier.new,
  48. );