BoxDecoration 是什么?
BoxDecoration 是 Flutter 中用于装饰 Container 的类,可以为容器添加背景色、边框、圆角、阴影、渐变等视觉效果。它是 Flutter UI 设计中最常用的装饰工具之一。
核心属性
BoxDecoration({
Color? color, // 背景色
DecorationImage? image, // 背景图片
BoxBorder? border, // 边框
BorderRadius? borderRadius, // 圆角
List<BoxShadow>? boxShadow, // 阴影
Gradient? gradient, // 渐变
BlendMode? backgroundBlendMode, // 混合模式
BoxShape shape, // 形状(矩形/圆形)
})
在你项目中的实际应用
让我结合你的代码来说明:
1. 阴影效果 - 地址栏和底部导航栏
// lib/screens/home_screen.dart 第 243-251 行
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface, // 背景色
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.1), // 半透明黑色
blurRadius: 4, // 模糊半径 4px
offset: const Offset(0, 2), // 向下偏移 2px
),
],
),
// ...
)
作用:给地址栏添加轻微的下阴影,产生"浮起"的视觉效果,增强层次感。
2. 圆角背景 - 搜索框
// lib/screens/home_screen.dart 第 257-261 行
Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surfaceContainerHighest,
borderRadius: BorderRadius.circular(24), // 圆角半径 24px
),
child: TextField(...),
)
作用:创建圆角搜索框,24px 的圆角让输入框看起来更柔和、现代。
3. 渐变背景 - 主页背景
// lib/screens/home_screen.dart 第 292-307 行
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft, // 从左上角开始
end: Alignment.bottomRight, // 到右下角结束
colors: isDark
? [
const Color(0xFF0f0c29), // 深紫蓝
const Color(0xFF302b63), // 中紫
const Color(0xFF24243e), // 深蓝紫
]
: [
const Color(0xFFa8edea), // 薄荷青
const Color(0xFFc3f0ca), // 浅绿
const Color(0xFFffffff), // 白色
],
stops: const [0.0, 0.5, 1.0], // 颜色分布位置
),
),
// ...
)
作用:创建对角线渐变背景,深色模式用紫蓝色系,浅色模式用清新的青绿色系,让主页更有视觉吸引力。
4. 半透明背景 + 圆角 - 网站图标
// lib/screens/home_screen.dart 第 366-370 行
Container(
width: 56,
height: 56,
decoration: BoxDecoration(
color: color.withValues(alpha: 0.1), // 10% 透明度的彩色背景
borderRadius: BorderRadius.circular(12), // 12px 圆角
),
child: Icon(icon, color: color, size: 28),
)
作用:为图标创建带颜色的半透明背景,既能显示图标的主题色,又不会太抢眼。
5. 圆角顶部 - 底部弹窗
// lib/screens/home_screen.dart 第 504-508 行
Container(
height: MediaQuery.of(context).size.height * 0.7,
decoration: BoxDecoration(
color: isDark ? const Color(0xFF1e1e1e) : Colors.white,
borderRadius: const BorderRadius.vertical(
top: Radius.circular(20), // 只有顶部圆角
),
),
// ...
)
作用:创建底部弹窗的圆角顶部,这是 Material Design 中 Bottom Sheet 的标准样式。
6. 圆形徽章 - 通知红点
// lib/widgets/browser_menu.dart 第 223-227 行
Container(
width: 12,
height: 12,
decoration: BoxDecoration(
color: Colors.red,
shape: BoxShape.circle, // 圆形
),
)
作用:创建小红点通知徽章,用 BoxShape.circle 让正方形容器变成圆形。
常见使用模式
模式 1:卡片效果
BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.1),
blurRadius: 8,
offset: Offset(0, 4),
),
],
)
模式 2:边框容器
BoxDecoration(
border: Border.all(color: Colors.grey, width: 1),
borderRadius: BorderRadius.circular(8),
)
模式 3:圆形头像
BoxDecoration(
shape: BoxShape.circle,
image: DecorationImage(
image: NetworkImage('url'),
fit: BoxFit.cover,
),
)
注意事项
- color 和 gradient 不能同时使用:如果设置了 gradient,color 会被忽略
- shape 为 circle 时不能设置 borderRadius:圆形和圆角矩形是互斥的
- 性能考虑:复杂的阴影和渐变会影响性能,避免在列表项中过度使用
-
主题适配:你的项目中大量使用
Theme.of(context)来适配深色/浅色模式,这是很好的实践