feat(client/stats): 统计页重设计 — 月/周/日周期卡 + 设备下拉 + 两周折线 + 修刷新
布局重做(对照确认稿): - 3 张周期卡(本月/本周/今日),每张 = ↓下行 · ↑上行 · 使用时长(PeriodCard) - 右上设备下拉(_DeviceDropdown,先只挂「全部」;每设备归因打通后填设备名,见 TODO #9/#10) - 柱状图 → 折线图:最近两周(14 天)按天流量(UsageLineChart,CustomPainter 零依赖) 数据源统一 + 修刷新(根治「本月流量冻住」): - 月/周/日 + 折线全从单一源 usageProvider(30) 聚合(取最后 N 天点求和,末点即今日, 避开 UTC/本地日期坑);不再 me.weekly + usage 两条管线 - usageProvider/deviceUsageProvider 改 autoDispose(进页重取)+ 下拉刷新(invalidate) + 刷新连带 meProvider.refresh。后端每 60s 更新,无需更勤 UI 全走 PangolinColors/Text/Spacing token 单源、零硬编码;中英 l10n key 补齐。 widget 数值断言测试(刀1)按新结构重写并通过;统计/连接页 golden 重生成 (非 CI 闸;components/auth 基线未动)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../models/device.dart';
|
||||
import '../models/device_usage.dart';
|
||||
import '../models/me.dart';
|
||||
import '../models/plan.dart';
|
||||
import '../models/usage_point.dart';
|
||||
@@ -55,11 +56,21 @@ final plansProvider = FutureProvider<List<Plan>>((ref) async {
|
||||
});
|
||||
|
||||
/// 最近 N 天用量(GET /v1/usage?days=N)。未登录返回空。
|
||||
final usageProvider = FutureProvider.family<List<UsagePoint>, int>((ref, days) async {
|
||||
/// autoDispose:离开统计页即销毁,重进自动重取(配合下拉刷新/连接态变化 invalidate),
|
||||
/// 根治「本月流量取一次就冻住」。后端每 60s 才更新,无需更勤刷新。
|
||||
final usageProvider = FutureProvider.autoDispose.family<List<UsagePoint>, int>((ref, days) async {
|
||||
if (!ref.watch(authProvider).isLoggedIn) return const [];
|
||||
return ref.read(accountApiProvider).usage(days: days);
|
||||
});
|
||||
|
||||
/// 最近 N 天按设备用量(GET /v1/usage/devices?days=N)。统计页设备下拉/明细用。
|
||||
/// 未登录返回空。autoDispose 同 usageProvider。
|
||||
final deviceUsageProvider =
|
||||
FutureProvider.autoDispose.family<List<DeviceUsage>, int>((ref, days) async {
|
||||
if (!ref.watch(authProvider).isLoggedIn) return const [];
|
||||
return ref.read(accountApiProvider).deviceUsage(days: days);
|
||||
});
|
||||
|
||||
/// 已登录设备列表(GET /v1/me/devices)。
|
||||
class DevicesNotifier extends AsyncNotifier<List<Device>> {
|
||||
@override
|
||||
|
||||
Reference in New Issue
Block a user