bb39b36d84
- account_providers:新增 meProvider(GET /v1/me,登录态变化自动重取)、 plansProvider、usageProvider(family by days)。 - isFreePlanProvider 改为派生自 meProvider.plan(去掉可写演示开关)。 - quotaProvider:总额取 plans free.daily_minutes,今日剩余取 me.quota_today_min (后端已算好);adUnlocked 保留本地态(ad SDK 未接)。 - account_page:邮箱/套餐/到期接 me;删「演示:免费版视角」开关 + kDemoEmail; 协议标签 WireGuard→REALITY/Hysteria2。 - 重写 quota_controller_test 为 provider 驱动;account/quota golden 重生成。 flutter analyze 0 error;113 tests passed。统计页(weekly/月流量/延迟)随 P4 一并接(其均延迟依赖 P4 实测探针)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
28 lines
1.1 KiB
Dart
28 lines
1.1 KiB
Dart
// app_providers.dart — 语言 / 主题 / 套餐视角等基础状态(Riverpod)
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../l10n/app_text.dart';
|
|
import '../l10n/strings_en.dart';
|
|
import '../l10n/strings_zh.dart';
|
|
import 'account_providers.dart';
|
|
|
|
/// 当前语言(单显)。设置/账户页段控切换。
|
|
final localeProvider = StateProvider<AppLang>((ref) => AppLang.zh);
|
|
|
|
/// 由语言派生的文案资源——UI 一律通过它取文案,不写死字面量。
|
|
final appTextProvider = Provider<AppText>((ref) {
|
|
final lang = ref.watch(localeProvider);
|
|
return lang == AppLang.zh ? const StringsZh() : const StringsEn();
|
|
});
|
|
|
|
/// 主题模式。默认跟随系统;设置页可显式切深色。
|
|
final themeModeProvider = StateProvider<ThemeMode>((ref) => ThemeMode.system);
|
|
|
|
/// 是否免费档——派生自真实账户(meProvider.plan == 'free')。
|
|
/// 免费版才显示额度卡与免费横幅;加载中默认按免费处理。
|
|
final isFreePlanProvider = Provider<bool>((ref) {
|
|
final me = ref.watch(meProvider).valueOrNull;
|
|
return me?.isFree ?? true;
|
|
});
|