70 lines
2.0 KiB
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',
|
|
);
|
|
});
|