market_service.dart 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import 'package:dio/dio.dart';
  2. import '../models/home/activity_banner.dart';
  3. import '../models/home/app_header_item.dart';
  4. import '../models/home/market_ticker.dart';
  5. /// 行情 API 服务
  6. class MarketService {
  7. const MarketService(this._dio);
  8. final Dio _dio;
  9. /// 获取合约币对列表(/swap/coin/enabled-list)
  10. /// 返回交易对静态信息(symbol, icon, isHot 等),价格由 WebSocket 推送
  11. Future<List<MarketTicker>> getEnabledCoins() async {
  12. final response = await _dio.get<Map<String, dynamic>>('swap/coin/enabled-list');
  13. final raw = response.data?['data'];
  14. final List<dynamic> list;
  15. if (raw is List) {
  16. list = raw;
  17. } else if (raw is Map && raw['data'] is List) {
  18. list = raw['data'] as List;
  19. } else {
  20. list = [];
  21. }
  22. return list
  23. .whereType<Map<String, dynamic>>()
  24. .map((e) => MarketTicker.fromJson(e))
  25. .toList();
  26. }
  27. /// 获取涨幅榜 (/market-new/rank/rise)
  28. Future<List<MarketTicker>> getRiseRank() async {
  29. return _fetchRank('market-new/rank/rise');
  30. }
  31. /// 获取跌幅榜 (/market-new/rank/fall)
  32. Future<List<MarketTicker>> getFallRank() async {
  33. return _fetchRank('market-new/rank/fall');
  34. }
  35. /// 通用排行榜请求
  36. Future<List<MarketTicker>> _fetchRank(String path) async {
  37. final response = await _dio.get<Map<String, dynamic>>(path);
  38. final raw = response.data?['data'];
  39. if (raw is! List) return [];
  40. return raw.whereType<Map<String, dynamic>>().map((json) {
  41. // symbol: "BTCUSDT", closePrice: "92328.30", changePercent: 1.60, volume: "123000"
  42. final symbol = json['symbol'] as String? ?? '';
  43. final base = symbol.replaceAll('USDT', '');
  44. return MarketTicker(
  45. symbol: symbol,
  46. baseAsset: base,
  47. lastPrice: double.tryParse(json['closePrice']?.toString() ?? '') ?? 0,
  48. change24h: (json['changePercent'] as num?)?.toDouble() ?? 0,
  49. volume24h: double.tryParse(json['volume']?.toString() ?? '') ?? 0,
  50. isFutures: true,
  51. );
  52. }).toList();
  53. }
  54. /// 获取首页 Banner 列表
  55. Future<List<ActivityBanner>> getBanners() async {
  56. final response = await _dio.get<Map<String, dynamic>>(
  57. 'contract/app-banner/active-list',
  58. );
  59. final list = response.data?['data'] as List<dynamic>? ?? [];
  60. return list
  61. .map((e) => ActivityBanner.fromJson(e as Map<String, dynamic>))
  62. .toList();
  63. }
  64. /// 获取首页 Header 列表(视频/图片)
  65. Future<List<AppHeaderItem>> getAppHeaders() async {
  66. final response = await _dio.get<Map<String, dynamic>>(
  67. 'contract/app-header/active-list',
  68. );
  69. final list = response.data?['data'] as List<dynamic>? ?? [];
  70. return list
  71. .map((e) => AppHeaderItem.fromJson(e as Map<String, dynamic>))
  72. .toList();
  73. }
  74. }