import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../domain/entities/contribution.dart'; import '../../domain/entities/contribution_record.dart'; import '../../domain/usecases/contribution/get_user_contribution.dart'; import '../../domain/repositories/contribution_repository.dart'; import '../../core/di/injection.dart'; final getUserContributionUseCaseProvider = Provider((ref) { return getIt(); }); final contributionRepositoryProvider = Provider((ref) { return getIt(); }); final contributionProvider = FutureProvider.family( (ref, accountSequence) async { // 空字符串不请求 if (accountSequence.isEmpty) return null; final useCase = ref.watch(getUserContributionUseCaseProvider); final result = await useCase(accountSequence); // 保持 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), (contribution) => contribution, ); }, ); /// 贡献值记录请求参数 class ContributionRecordsParams { final String accountSequence; final int page; final int pageSize; const ContributionRecordsParams({ required this.accountSequence, this.page = 1, this.pageSize = 10, }); @override bool operator ==(Object other) => identical(this, other) || other is ContributionRecordsParams && runtimeType == other.runtimeType && accountSequence == other.accountSequence && page == other.page && pageSize == other.pageSize; @override int get hashCode => accountSequence.hashCode ^ page.hashCode ^ pageSize.hashCode; } /// 贡献值记录 Provider final contributionRecordsProvider = FutureProvider.family( (ref, params) async { // 空字符串不请求 if (params.accountSequence.isEmpty) return null; final repository = ref.watch(contributionRepositoryProvider); final result = await repository.getContributionRecords( params.accountSequence, page: params.page, pageSize: params.pageSize, ); // 保持 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), (records) => records, ); }, );