import 'package:flutter/material.dart'; /// 用户积分等全局状态 class UserState { UserState._(); static final ValueNotifier credits = ValueNotifier(null); static final ValueNotifier userId = ValueNotifier(null); static final ValueNotifier avatar = ValueNotifier(null); static final ValueNotifier userName = ValueNotifier(null); /// 国家码 (navigate / countryCode) static final ValueNotifier navigate = ValueNotifier(null); /// 是否启用第三方支付(来自 common_info surge.enable_third_party_payment) static final ValueNotifier enableThirdPartyPayment = ValueNotifier(null); 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 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(); } 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 createState() => _UserCreditsScopeState(); } class _UserCreditsScopeState extends State { @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, ); } }