ea1af967a0
ci-pangolin / Lint — shellcheck (push) Successful in 5s
ci-pangolin / OpenAPI Sync Check (push) Successful in 17s
ci-pangolin / Redline Scan — 脱敏 (UI 文案) (push) Successful in 5s
ci-pangolin / Flutter — analyze + test (push) Successful in 22s
ci-pangolin / Portable SQL — 可移植性 (mysql/sqlite) (push) Successful in 5s
ci-pangolin / Codegen Drift — token 生成物未漂移 (push) Successful in 5s
ci-pangolin / Go — build + test (push) Successful in 9s
ci-pangolin / E2E Smoke — L4 进程级端到端 (push) Successful in 14s
ci-pangolin / Go — integration (mysql/redis testcontainers) (push) Successful in 4m11s
ci-pangolin / Golden — 视觉回归 (components + auth) (push) Successful in 14s
之前 .valueOrNull ?? 默认 → 数据没到时先渲染默认态(统计 0 / 连接页免费广告), me/usage 到了再跳真实态,闪烁体验差。改为关键 provider 首拉(loading 且无缓存)时 整页 CircularProgressIndicator: - 统计页:gate on usageProvider(30) - 连接页:gate on 新增 meLoadingProvider(me 是常驻 Notifier,只首启转一下) 未登录/golden 场景 me 同步返回默认=不加载,不影响 golden。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
35 lines
1.4 KiB
Dart
35 lines
1.4 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;
|
|
});
|
|
|
|
/// 账户聚合是否仍在「首拉」(加载中且无缓存)。连接页/统计页据此先转圈再渲染,
|
|
/// 避免免费默认态闪一下(广告/0)再跳成真实数据。
|
|
final meLoadingProvider = Provider<bool>((ref) {
|
|
final me = ref.watch(meProvider);
|
|
return me.isLoading && !me.hasValue;
|
|
});
|