当我们开始接触 Flutter 时,大多数人都会紧紧抓住那些经典组件 :Container
、Row
、Column
,也许还有 ListView
。但是 Flutter 的组件目录非常庞大,许多强大的组件却经常被人们忽视。
欢迎微信公众号:OpenFlutter,感谢
在这篇文章中,我将带你了解 10 个被低估的 Flutter 组件 ,它们能够显著加快你的工作流程 、减少样板代码 ,并让你的应用更加精致。我会保持讲解友好且实用,并提供你可以直接粘贴到代码中的小示例。
1. FractionallySizedBox
你是否曾在响应式布局中挣扎过,想要让一个组件占据例如 70% 的宽度?这个组件就能帮你解决这个问题。
dart
FractionallySizedBox(
widthFactor: 0.7,
child: ElevatedButton(
onPressed: () {},
child: Text("70% Width Button"),
),
)
取代处理 MediaQuery
和手动计算的麻烦,这个组件可以干净利落地完成这一工作。
2. AspectRatio
非常适合保持一致的比例(例如视频、卡片或图片)。
dart
AspectRatio(
aspectRatio: 16 / 9,
child: Container(
color: Colors.blue,
child: Center(child: Text("16:9 Box")),
),
)
不必再在已经知道宽度的情况下去猜测高度了。
3. ClipRRect
轻松实现圆角 ------无需在每个地方都手动设置 borderRadius
。
dart
ClipRRect(
borderRadius: BorderRadius.circular(20),
child: Image.network("https://via.placeholder.com/150"),
)
这是美化你的 UI 最简单的方法之一。
4. LimitedBox
你是否遇到过 ListView
的子组件因为没有给定约束 而无限增长的情况? LimitedBox
可以帮你控制住局面。
dart
ListView(
children: [
LimitedBox(
maxHeight: 200,
child: Container(color: Colors.red),
),
],
)
尤其在混合使用可滚动(scrollable)和不可滚动(non-scrollable)组件时非常方便。
5. Expanded + Spacer
是的,你可能知道 Expanded ,但你是否使用过 Spacer ?它是一种干净利落地添加灵活空白空间的方法。
dart
Row(
children: [
Text("Left"),
Spacer(),
Text("Right"),
],
)
比添加一个 Expanded(child: Container())
更简洁。
6. Wrap
厌倦了 Row
或 Column
中组件溢出的问题? Wrap
能让项目自动换到下一行。
dart
Wrap(
spacing: 8,
runSpacing: 4,
children: List.generate(10, (i) => Chip(label: Text("Item $i"))),
)
当文本或**标签(chips)**无法容纳时,你的 UI 会感谢你使用了它。
7. ReorderableListView
需要拖放重新排序功能?Flutter 已经直接为你提供了这个组件。
dart
ReorderableListView(
onReorder: (oldIndex, newIndex) {},
children: List.generate(
5,
(i) => ListTile(
key: ValueKey(i),
title: Text("Item $i"),
),
),
)
它可以让你避免重复发明轮子,无需编写自定义的拖动逻辑。
8. AnimatedSwitcher
想要在切换组件时实现平滑的过渡效果吗?试试这个。
dart
int _count = 0;
AnimatedSwitcher(
duration: Duration(milliseconds: 300),
child: Text(
'$_count',
key: ValueKey(_count),
style: TextStyle(fontSize: 30),
),
)
每当 _count
改变时,组件就会漂亮地淡入淡出。
9. DraggableScrollableSheet
想象一下 Google 地图中那个可以展开的底部工作表(bottom sheet)------这就是这个组件。
dart
DraggableScrollableSheet(
builder: (context, controller) {
return Container(
color: Colors.white,
child: ListView.builder(
controller: controller,
itemCount: 30,
itemBuilder: (_, i) => ListTile(title: Text("Item $i")),
),
);
},
)
它以最少的代码添加了流畅的用户体验(slick UX)。
10. FittedBox
告别文本或图标溢出 ------这个组件会自动缩小它们。
dart
FittedBox(
child: Text(
"This is a very very very long text",
style: TextStyle(fontSize: 30),
),
)
在为多种屏幕尺寸进行设计时,它简直是救星。
Flutter 的魅力在于其组件生态系统 。一旦你探索了基础组件之外的世界,你就会发现一些感觉像是"秘密武器"的组件------它们能让你用更少的精力,打造出更具响应性、交互性和优雅性的 UI。
下次当你为布局或动画绞尽脑汁时,不妨试试这些被低估的瑰宝之一。它们很可能会为你节省数小时的开发时间。
👉 现在轮到你了:这些组件中,你最常用的是哪一个?哪一个又让你感到惊喜呢?