showNetworkError static method

void showNetworkError(
  1. BuildContext context,
  2. int statusCode,
  3. String userMessage, {
  4. VoidCallback? onRetry,
})

显示网络错误(专门处理NetworkException)

Implementation

static void showNetworkError(
  BuildContext context,
  int statusCode,
  String userMessage, {
  VoidCallback? onRetry,
}) {
  String title;
  IconData icon;

  switch (statusCode) {
    case 404:
      title = '功能暂未开放';
      icon = Icons.construction_outlined;
      break;
    case 401:
    case 403:
      title = '访问受限';
      icon = Icons.lock_outline;
      break;
    case 500:
    case 503:
      title = '服务异常';
      icon = Icons.cloud_off_outlined;
      break;
    default:
      title = '请求失败';
      icon = Icons.error_outline;
  }

  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Container(
        padding: const EdgeInsets.symmetric(vertical: 12),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              children: [
                Icon(
                  icon,
                  color: const Color(0xFFE53935),
                  size: 24,
                ),
                const SizedBox(width: 12),
                Expanded(
                  child: Text(
                    title,
                    style: const TextStyle(
                      fontFamily: 'AlibabaPuHuiTi',
                      fontSize: 15,
                      fontWeight: FontWeight.w600,
                      color: Color(0xFFC62828),
                    ),
                  ),
                ),
              ],
            ),
            const SizedBox(height: 8),
            Padding(
              padding: const EdgeInsets.only(left: 36),
              child: Text(
                userMessage,
                style: const TextStyle(
                  fontFamily: 'AlibabaPuHuiTi',
                  fontSize: 13,
                  color: Color(0xFF666666),
                ),
              ),
            ),
          ],
        ),
      ),
      backgroundColor: const Color(0xFFFEF5F5),
      behavior: SnackBarBehavior.floating,
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(12),
        side: BorderSide(
          color: const Color(0xFFE53935).withOpacity(0.2),
          width: 1.5,
        ),
      ),
      margin: const EdgeInsets.all(16),
      elevation: 4,
      duration: const Duration(seconds: 4),
      action: onRetry != null
          ? SnackBarAction(
              label: '重试',
              textColor: const Color(0xFFE53935),
              onPressed: onRetry,
            )
          : null,
    ),
  );
}