import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:country_flags/country_flags.dart'; import 'package:flutter/foundation.dart'; class KRCountryFlag extends StatelessWidget { final String countryCode; final double? width; final double? height; final bool isCircle; final BoxFit fit; // 填充模式 final bool maintainSize; // 是否保持宽高比 final Color? bgColor; // 背景色 final bool clip; // 是否裁剪 const KRCountryFlag({ Key? key, required this.countryCode, this.width, this.height, this.isCircle = true, this.fit = BoxFit.cover, // 默认填充 this.maintainSize = true, // 默认保持宽高比 this.bgColor = Colors.white, this.clip = true, // 默认裁剪 }) : super(key: key); String _getCountryCode(String code) { // 处理特殊国家代码 final Map specialCases = { 'UK': 'gb', 'USA': 'us', // 添加其他特殊情况... }; return specialCases[code.toUpperCase()] ?? code.toLowerCase(); } @override Widget build(BuildContext context) { // 🔍 调试日志 if (kDebugMode) { print('🏳️ KRCountryFlag.build 被调用'); } if (kDebugMode) { print(' - 原始 countryCode: "$countryCode"'); } if (kDebugMode) { print(' - countryCode.isEmpty: ${countryCode.isEmpty}'); } if (kDebugMode) { print(' - countryCode.length: ${countryCode.length}'); } final processedCode = _getCountryCode(countryCode); if (kDebugMode) { print(' - 处理后 code: "$processedCode"'); } // 如果国家代码为空,显示占位符 if (countryCode.isEmpty) { if (kDebugMode) { print(' ❌ 国家代码为空,显示占位符'); } return Container( width: width ?? 50.w, height: height ?? 50.w, decoration: BoxDecoration( color: Colors.grey[300], shape: isCircle ? BoxShape.circle : BoxShape.rectangle, borderRadius: !isCircle ? BorderRadius.circular(8.w) : null, ), child: Icon(Icons.flag, color: Colors.grey[600], size: 24.w), ); } // 计算实际尺寸 final double actualWidth = width ?? 50.w; final double actualHeight = maintainSize ? actualWidth : (height ?? 50.w); if (kDebugMode) { print(' ✅ 尝试加载国旗: $processedCode'); } Widget flagWidget = CountryFlag.fromCountryCode( processedCode, width: actualWidth, height: actualHeight, ); // 添加填充模式 flagWidget = SizedBox( width: actualWidth, height: actualHeight, child: FittedBox( fit: fit, child: flagWidget, ), ); // 添加背景和形状 flagWidget = Container( width: actualWidth, height: actualHeight, decoration: BoxDecoration( color: bgColor, shape: isCircle ? BoxShape.circle : BoxShape.rectangle, borderRadius: !isCircle ? BorderRadius.circular(8.w) : null, ), child: flagWidget, ); // 最后添加裁剪 if (clip && isCircle) { flagWidget = ClipOval(child: flagWidget); } return flagWidget; } }