import 'package:lucide_icons_flutter/lucide_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/theme/context_tokens.dart'; import '../providers/connectivity_provider.dart'; import 'ds/ds_toast.dart'; /// 离线提示里的「重试」按钮: /// - 检测中显示转圈 +「重试中…」(过程可感知) /// - 重试结束用 SnackBar 反馈成功/失败(结果可感知) /// /// [foreground] 适配不同底色(红色横幅用白字,琥珀框用深色)。 class NetworkRetryButton extends ConsumerWidget { final Color foreground; const NetworkRetryButton( {super.key, this.foreground = Colors.white}); // ds-ignore: 横幅承载色上默认白字 @override Widget build(BuildContext context, WidgetRef ref) { final checking = ref.watch(connectivityCheckingProvider); return TextButton( onPressed: checking ? null : () async { final ok = await ref.read(connectivityProvider.notifier).retry(); if (!context.mounted) return; showDsToast( context, ok ? '已重新连接服务器' : '仍无法连接服务器,请稍后重试', bg: ok ? context.tokens.success : context.tokens.danger, duration: const Duration(seconds: 2), ); }, style: TextButton.styleFrom( foregroundColor: foreground, minimumSize: const Size(0, 32), padding: const EdgeInsets.symmetric(horizontal: 10), tapTargetSize: MaterialTapTargetSize.shrinkWrap, ), child: Row( mainAxisSize: MainAxisSize.min, children: [ if (checking) SizedBox( width: 14, height: 14, child: CircularProgressIndicator( strokeWidth: 2, valueColor: AlwaysStoppedAnimation(foreground), ), ) else Icon(LucideIcons.refreshCw, size: 16, color: foreground), const SizedBox(width: 6), Text( checking ? '重试中…' : '重试', style: TextStyle( color: foreground, fontSize: 13, fontWeight: FontWeight.w600), ), ], ), ); } }