import 'package:flutter/material.dart'; import 'package:miaoji_zhang/shared/services/push_service.dart'; import 'package:miaoji_zhang/shared/theme/app_theme.dart'; import 'package:miaoji_zhang/shared/widgets/app_controls.dart'; class PushSettingsPage extends StatefulWidget { const PushSettingsPage({super.key}); @override State createState() => _PushSettingsPageState(); } class _PushSettingsPageState extends State { final service = PushService.instance; @override void initState() { super.initState(); service.addListener(_changed); service.refresh(); } @override void dispose() { service.removeListener(_changed); super.dispose(); } void _changed() { if (mounted) setState(() {}); } Future _toggle(String category, bool value) async { final ok = await service.setCategory(category, value); if (!ok && mounted && service.lastError != null) { ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text(service.lastError!))); } } @override Widget build(BuildContext context) { final status = service.nativeStatus; return Scaffold( appBar: AppBar(title: const Text('通知设置')), body: ListView( padding: const EdgeInsets.fromLTRB(16, 8, 16, 24), children: [ Card( child: Column( children: [ _switchRow( '系统通知', '版本更新和重要服务状态', service.preferences.system, (value) => _toggle('system', value), ), const Divider(height: 1), _switchRow( '预算提醒', '预算达到 80% 或 100% 时提醒', service.preferences.budget, (value) => _toggle('budget', value), ), const Divider(height: 1), _switchRow( '运营通知', '活动和产品公告', service.preferences.operations, (value) => _toggle('operations', value), ), ], ), ), const SizedBox(height: 12), Card( child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( '推送通道', style: TextStyle(fontSize: 14, fontWeight: FontWeight.w800), ), const SizedBox(height: 8), Text( _providerLabel(status.provider), style: TextStyle(color: context.jz.text2, fontSize: 12), ), const SizedBox(height: 4), Text( _statusLabel(status), style: TextStyle( color: status.notificationsAllowed ? context.jz.text2 : AppTheme.orange, fontSize: 12, ), ), if (!status.notificationsAllowed) ...[ const SizedBox(height: 12), JzActionButton( label: '打开系统通知设置', onPressed: service.openNotificationSettings, secondary: true, ), ], ], ), ), ), if (service.loading) ...[ const SizedBox(height: 16), const Center(child: CircularProgressIndicator(strokeWidth: 2)), ], ], ), ); } Widget _switchRow( String title, String subtitle, bool value, ValueChanged onChanged, ) => Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), child: Row( children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title, style: const TextStyle(fontWeight: FontWeight.w700)), const SizedBox(height: 3), Text( subtitle, style: TextStyle(color: context.jz.text2, fontSize: 11.5), ), ], ), ), Switch(value: value, onChanged: service.loading ? null : onChanged), ], ), ); String _providerLabel(String? provider) => switch (provider) { 'huawei' => '华为 Push Kit', 'honor' => '荣耀 Push Kit', 'xiaomi' => '小米推送', 'oppo' => 'OPPO 推送', 'vivo' => 'vivo 推送', 'meizu' => '魅族推送', _ => '当前设备没有可用的国产厂商通道', }; String _statusLabel(PushNativeStatus status) { if (!status.supported) return '不支持'; if (!status.sdkAvailable) return '当前安装包未配置对应厂商 SDK'; if (!status.notificationsAllowed) return '系统通知权限已关闭'; if (status.token?.isNotEmpty == true) return '已连接'; if (status.enabled) return '正在获取厂商令牌'; return '未启用'; } }