petsHero-AI/lib/core/user/user_state.dart
2026-03-24 18:45:27 +08:00

131 lines
3.7 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
/// 用户积分等全局状态
class UserState {
UserState._();
static final ValueNotifier<int?> credits = ValueNotifier<int?>(null);
static final ValueNotifier<String?> userId = ValueNotifier<String?>(null);
static final ValueNotifier<String?> avatar = ValueNotifier<String?>(null);
static final ValueNotifier<String?> userName = ValueNotifier<String?>(null);
/// 国家码 (navigate / countryCode)
static final ValueNotifier<String?> navigate = ValueNotifier<String?>(null);
/// 是否启用第三方支付(来自 common_info surge.lucky
static final ValueNotifier<bool?> enableThirdPartyPayment =
ValueNotifier<bool?>(null);
/// 是否展示 Video 分类栏(来自 common_info surge.need_wait见 docs/extConfig.md
static final ValueNotifier<bool?> needShowVideoMenu = ValueNotifier<bool?>(null);
/// 是否防止截屏(来自 common_info surge.safe_area见 docs/extConfig.md
static final ValueNotifier<bool?> safeArea = ValueNotifier<bool?>(null);
/// extConfig.items 图片列表(来自 common_info surge.items
static final ValueNotifier<List<dynamic>?> extConfigItems = ValueNotifier<List<dynamic>?>(null);
/// 递增后 Home 页应完整重走「加载分类 → 加载任务」流程(如 need_wait 变化)
static final ValueNotifier<int> homeReloadNonce = ValueNotifier<int>(0);
static void requestHomeFullReload() {
homeReloadNonce.value = homeReloadNonce.value + 1;
}
static void setCredits(int? value) {
credits.value = value;
}
static void setUserId(String? value) {
userId.value = value;
}
static void setAvatar(String? value) {
avatar.value = value;
}
static void setUserName(String? value) {
userName.value = value;
}
static void setNavigate(String? value) {
navigate.value = value;
}
static void setEnableThirdPartyPayment(bool? value) {
enableThirdPartyPayment.value = value;
}
static void setExtConfig({
bool? needShowVideoMenuValue,
bool? safeAreaValue,
List<dynamic>? items,
}) {
if (needShowVideoMenuValue != null) needShowVideoMenu.value = needShowVideoMenuValue;
if (safeAreaValue != null) safeArea.value = safeAreaValue;
if (items != null) extConfigItems.value = items;
}
static String formatCredits(int? value) {
if (value == null) return '--';
return value.toString().replaceAllMapped(
RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'),
(m) => '${m[1]},',
);
}
}
/// 提供积分数据的 InheritedWidget
class UserCreditsData extends InheritedWidget {
const UserCreditsData({
super.key,
required this.credits,
required super.child,
});
final int? credits;
static UserCreditsData? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<UserCreditsData>();
}
String get creditsDisplay => UserState.formatCredits(credits);
@override
bool updateShouldNotify(UserCreditsData oldWidget) {
return oldWidget.credits != credits;
}
}
/// 监听 UserState.credits 并向下提供 UserCreditsData
class UserCreditsScope extends StatefulWidget {
const UserCreditsScope({super.key, required this.child});
final Widget child;
@override
State<UserCreditsScope> createState() => _UserCreditsScopeState();
}
class _UserCreditsScopeState extends State<UserCreditsScope> {
@override
void initState() {
super.initState();
UserState.credits.addListener(_onCreditsChanged);
}
@override
void dispose() {
UserState.credits.removeListener(_onCreditsChanged);
super.dispose();
}
void _onCreditsChanged() {
setState(() {});
}
@override
Widget build(BuildContext context) {
return UserCreditsData(
credits: UserState.credits.value,
child: widget.child,
);
}
}