top_trader_provider.dart 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import 'package:dio/dio.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import '../core/network/dio_client.dart';
  4. import '../data/models/home/top_trader.dart';
  5. /// 顶级交易员列表状态
  6. class TopTraderState {
  7. final List<TopTrader> traders;
  8. final bool isLoading;
  9. const TopTraderState({
  10. this.traders = const [],
  11. this.isLoading = false,
  12. });
  13. TopTraderState copyWith({
  14. List<TopTrader>? traders,
  15. bool? isLoading,
  16. }) =>
  17. TopTraderState(
  18. traders: traders ?? this.traders,
  19. isLoading: isLoading ?? this.isLoading,
  20. );
  21. }
  22. class TopTraderNotifier extends Notifier<TopTraderState> {
  23. @override
  24. TopTraderState build() {
  25. Future.microtask(_fetch);
  26. return const TopTraderState(isLoading: true);
  27. }
  28. Future<void> refresh() => _fetch();
  29. Future<void> _fetch() async {
  30. try {
  31. final dio = ref.read(dioClientProvider);
  32. final resp = await dio.get<Map<String, dynamic>>(
  33. 'follow/customer/top-trader-list',
  34. queryParameters: {'isTop': 1},
  35. );
  36. final data = resp.data?['data'];
  37. if (data == null) {
  38. state = state.copyWith(isLoading: false);
  39. return;
  40. }
  41. final records = (data['records'] as List<dynamic>?) ?? [];
  42. final traders = records
  43. .map((e) => TopTrader.fromJson(e as Map<String, dynamic>))
  44. .toList();
  45. state = TopTraderState(traders: traders, isLoading: false);
  46. } on DioException {
  47. state = state.copyWith(isLoading: false);
  48. }
  49. }
  50. }
  51. final topTraderProvider =
  52. NotifierProvider<TopTraderNotifier, TopTraderState>(TopTraderNotifier.new);