rwadurian/frontend/mining-app/lib/presentation/providers/mining_providers.dart

70 lines
2.0 KiB
Dart

import 'dart:async';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../domain/entities/share_account.dart';
import '../../domain/entities/global_state.dart';
import '../../domain/usecases/mining/get_share_account.dart';
import '../../domain/usecases/mining/get_global_state.dart';
import '../../core/di/injection.dart';
// Use Cases Providers
final getShareAccountUseCaseProvider = Provider<GetShareAccount>((ref) {
return getIt<GetShareAccount>();
});
final getGlobalStateUseCaseProvider = Provider<GetGlobalState>((ref) {
return getIt<GetGlobalState>();
});
// State Providers - 使用 keepAlive 缓存数据,避免重复请求
final shareAccountProvider = FutureProvider.family<ShareAccount?, String>(
(ref, accountSequence) async {
// 空字符串不请求
if (accountSequence.isEmpty) return null;
final useCase = ref.watch(getShareAccountUseCaseProvider);
final result = await useCase(accountSequence);
// 保持 provider 活跃,避免每次 rebuild 都重新请求
ref.keepAlive();
// 5 分钟后自动失效,允许刷新
final timer = Timer(const Duration(minutes: 5), () {
ref.invalidateSelf();
});
ref.onDispose(() => timer.cancel());
return result.fold(
(failure) => throw Exception(failure.message),
(account) => account,
);
},
);
final globalStateProvider = FutureProvider<GlobalState?>((ref) async {
final useCase = ref.watch(getGlobalStateUseCaseProvider);
final result = await useCase();
// 保持 provider 活跃
ref.keepAlive();
// 5 分钟后自动失效
final timer = Timer(const Duration(minutes: 5), () {
ref.invalidateSelf();
});
ref.onDispose(() => timer.cancel());
return result.fold(
(failure) => throw Exception(failure.message),
(state) => state,
);
});
final currentPriceProvider = Provider<String>((ref) {
final globalState = ref.watch(globalStateProvider);
return globalState.when(
data: (state) => state?.currentPrice ?? '0',
loading: () => '0',
error: (_, __) => '0',
);
});