36 lines
1.3 KiB
Dart
36 lines
1.3 KiB
Dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../api/statistics_api.dart';
|
|
import '../models/statistics_response.dart';
|
|
import '../utils/date_util.dart';
|
|
|
|
/// 统计页的时间粒度
|
|
enum StatisticsTab { daily, weekly, monthly }
|
|
|
|
class StatisticsTabNotifier extends Notifier<StatisticsTab> {
|
|
@override
|
|
StatisticsTab build() => StatisticsTab.monthly; // 对齐 uniApp 默认按月
|
|
|
|
void set(StatisticsTab tab) => state = tab;
|
|
}
|
|
|
|
final statisticsTabProvider =
|
|
NotifierProvider<StatisticsTabNotifier, StatisticsTab>(StatisticsTabNotifier.new);
|
|
|
|
/// 按时间粒度取统计。日期范围在 provider 内按"当前时刻"计算,
|
|
/// 与 uniApp 行为一致:日=今天,周=本周一~今天,月=本自然月。
|
|
final statisticsProvider =
|
|
FutureProvider.autoDispose.family<StatisticsResponse, StatisticsTab>((ref, tab) {
|
|
final api = ref.watch(statisticsApiProvider);
|
|
final now = DateTime.now();
|
|
switch (tab) {
|
|
case StatisticsTab.daily:
|
|
final today = formatDate(now);
|
|
return api.getDaily(startDate: today, endDate: today);
|
|
case StatisticsTab.weekly:
|
|
return api.getWeekly(weekStart: formatDate(weekStart(now)));
|
|
case StatisticsTab.monthly:
|
|
return api.getMonthly(year: now.year, month: now.month);
|
|
}
|
|
});
|