Flutter 开发中常用的基础组件,一口气给你捋清楚#
Flutter 这套组件家族多得像过年走亲戚,但常用的就那几位,摸熟了,写 UI 真就顺滑得很。下面按照“最常遇到的场景”来分组,配上小例子,能抄能用。
页面骨架:Scaffold 家族#
- Scaffold: 一页的地基,有
appBar
、body
、bottomNavigationBar
、floatingActionButton
。 - AppBar: 顶部栏,标题、操作、返回都在这。
- BottomNavigationBar / NavigationBar: 底部切页。
- Drawer: 侧边抽屉。
Scaffold( appBar: AppBar(title: const Text('主页')), body: const Center(child: Text('Hello Flutter')), floatingActionButton: FloatingActionButton( onPressed: () {}, child: const Icon(Icons.add), ), bottomNavigationBar: BottomNavigationBar( items: const [ BottomNavigationBarItem(icon: Icon(Icons.home), label: '首页'), BottomNavigationBarItem(icon: Icon(Icons.settings), label: '设置'), ], ), drawer: const Drawer(child: Center(child: Text('抽屉内容'))),);
文本、图标、图片:显示是第一要务#
- Text: 文本显示,记得尽可能
const
。 - RichText / Text.rich: 富文本。
- Icon / Icons: 图标库好用得很。
- Image: 资源、网络、内存都能搞。
const Text('一条朴实无华的文字', style: TextStyle(fontSize: 16));
Text.rich(TextSpan( text: '账号:', children: [ TextSpan(text: 'breeze', style: const TextStyle(fontWeight: FontWeight.bold)), ],));
Image.network('https://picsum.photos/200', fit: BoxFit.cover);
盒子与装饰:把内容装好看#
- Container: 万金油(尺寸、对齐、边距、装饰),但别啥都它。
- SizedBox: 定宽高/占位,强推。
- Padding: 边距。
- Center / Align: 对齐控件。
- DecoratedBox: 只做装饰,不加多余属性。
Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), boxShadow: [BoxShadow(blurRadius: 8, color: Colors.black12)], ), child: const Text('盒子里头装点东西'),);
const SizedBox(height: 16);
布局三件套:Row / Column / Stack#
- Row / Column: 横竖排队,配
mainAxisAlignment
/crossAxisAlignment
。 - Expanded / Flexible: 占比拉伸,不会溢出。
- Spacer: 填空格。
- Stack: 叠起来,搞角标/悬浮。
Row( children: const [ Icon(Icons.place), SizedBox(width: 8), Expanded(child: Text('北京市 朝阳区 宋庄镇 123 号很长很长的地址')), ],);
Stack( children: [ Image.network('https://picsum.photos/400/200'), const Positioned(right: 8, bottom: 8, child: Chip(label: Text('NEW'))), ],);
滚动与列表:一天不用,浑身难受#
- ListView.builder: 长列表首选,按需构建。
- GridView.builder: 九宫格。
- SingleChildScrollView: 内容少但可能超出时。
- RefreshIndicator: 下拉刷新。
- ListTile / Divider / Card: 列表项三件套。
ListView.builder( itemCount: 50, itemBuilder: (context, index) => Card( margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), child: ListTile( leading: CircleAvatar(child: Text('${index + 1}')), title: Text('标题 $index'), subtitle: const Text('副标题来一口'), trailing: const Icon(Icons.chevron_right), ), ),);
输入与表单:能看更要能用#
- TextField: 单个输入,配
controller
更顺手。 - Form / TextFormField / FormState: 表单校验。
- Switch / Checkbox / Radio / Slider: 小控件一个不少。
final controller = TextEditingController();
TextField( controller: controller, decoration: const InputDecoration( labelText: '用户名', prefixIcon: Icon(Icons.person), border: OutlineInputBorder(), ),);
表单简单示例:
final formKey = GlobalKey<FormState>();
Form( key: formKey, child: Column( children: [ TextFormField( validator: (v) => (v == null || v.isEmpty) ? '必填' : null, ), const SizedBox(height: 12), ElevatedButton( onPressed: () { if (formKey.currentState!.validate()) { // 过关,提交! } }, child: const Text('提交'), ), ], ),);
按钮全家桶:按下去就有故事#
- ElevatedButton: 有立体感。
- TextButton: 扁平。
- OutlinedButton: 描边。
- IconButton / FloatingActionButton: 图标点击。
- InkWell / GestureDetector: 自定义点击水波或手势。
Row( children: [ ElevatedButton(onPressed: () {}, child: const Text('确定')), const SizedBox(width: 8), OutlinedButton(onPressed: () {}, child: const Text('取消')), const SizedBox(width: 8), IconButton(onPressed: () {}, icon: const Icon(Icons.share)), ],);
水波反馈更有质感:
InkWell( onTap: () {}, borderRadius: BorderRadius.circular(8), child: const Padding( padding: EdgeInsets.all(12), child: Text('点我有水波'), ),);
导航与切页:从这页到那页#
- Navigator:
push
/pop
。 - PageRouteBuilder / MaterialPageRoute: 自定义动画。
- TabBar / TabBarView / DefaultTabController: 同页内分栏。
- PageView: 横向/竖向翻页。
DefaultTabController( length: 3, child: Scaffold( appBar: AppBar( title: const Text('标签页'), bottom: const TabBar(tabs: [ Tab(text: '消息'), Tab(text: '联系人'), Tab(text: '我'), ]), ), body: const TabBarView(children: [ Center(child: Text('消息页')), Center(child: Text('联系人页')), Center(child: Text('我的页')), ]), ),);
反馈与弹层:有事说一声#
- SnackBar: 短暂提示。
- AlertDialog / SimpleDialog: 弹窗。
- BottomSheet / showModalBottomSheet: 底部抽屉。
ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('已保存')),);
状态与组件:写 UI 的“基本功”#
- StatelessWidget / StatefulWidget: 无状态 vs 有状态。
- setState: 小范围刷新 UI,记得只包对“会变”的地方。
- LayoutBuilder / MediaQuery: 响应式布局看尺寸。
- 强烈建议:能
const
就const
,小组件勤拆分。
class Counter extends StatefulWidget { const Counter({super.key});
@override State<Counter> createState() => _CounterState();}
class _CounterState extends State<Counter> { int count = 0;
@override Widget build(BuildContext context) { return Row( children: [ IconButton(onPressed: () => setState(() => count--), icon: const Icon(Icons.remove)), Text('$count'), IconButton(onPressed: () => setState(() => count++), icon: const Icon(Icons.add)), ], ); }}
实战小拼盘:卡片列表 + 搜索框 + 刷新#
class DemoPage extends StatelessWidget { const DemoPage({super.key});
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('常用组件拼盘')), body: RefreshIndicator( onRefresh: () async => Future.delayed(const Duration(milliseconds: 800)), child: ListView( padding: const EdgeInsets.all(12), children: [ TextField( decoration: InputDecoration( hintText: '搜索点啥…', prefixIcon: const Icon(Icons.search), border: OutlineInputBorder(borderRadius: BorderRadius.circular(12)), ), ), const SizedBox(height: 12), ...List.generate(5, (i) => Card( child: ListTile( leading: CircleAvatar(child: Text('${i + 1}')), title: Text('标题 $i'), subtitle: const Text('这里是副标题'), trailing: const Icon(Icons.chevron_right), onTap: () {}, ), )), ], ), ), floatingActionButton: FloatingActionButton.extended( onPressed: () {}, icon: const Icon(Icons.add), label: const Text('新建'), ), ); }}
经验小贴士#
- 列表用 builder:
ListView.builder
/GridView.builder
,别一次性全渲染。 - 尽量 const:静态子树省重建、省电省心。
- 长文字别忘自适应:
softWrap
、maxLines
、overflow
。 - 图片缓存:网络图默认会缓存;占位可用
FadeInImage
。 - 滚动里再滚动:尽量一个主滚动,嵌套要留意
shrinkWrap
和性能。 - 点击反馈选 Ink 系:
InkWell
+Material
背景,有水波更“Material”。
小结#
- 页面骨架:
Scaffold
、AppBar
、BottomNavigationBar
、Drawer
。 - 展示:
Text
、Icon
、Image
、Card
、ListTile
、Divider
。 - 布局:
Row
、Column
、Stack
、Expanded
、Padding
、SizedBox
、Align
。 - 滚动列表:
ListView.builder
、GridView.builder
、SingleChildScrollView
、RefreshIndicator
。 - 交互输入:
TextField
、Form
、各种 Button、InkWell
/GestureDetector
。 - 导航切页:
Navigator
、TabBar
、PageView
、对话框/抽屉/底部弹层。 - 好习惯:多用
const
、小组件拆分、按需构建、避免无谓嵌套和重建。
这些基础组件就是 Flutter 开发的“十八般兵器”,顺手用好,你的界面就有章有法,还带点“手起刀落”的快感。去码两把,越用越顺!