249 lines
5.0 KiB
Markdown
249 lines
5.0 KiB
Markdown
---
|
||
title: Flutter基础教程
|
||
date: 2025-12-05
|
||
---
|
||
|
||
# 应用核心Widget
|
||
```dart
|
||
// Flutter 应用的入口,配置主题、路由、国际化等。
|
||
MaterialApp(
|
||
home: HomePage(), // 必需:首页
|
||
theme: ThemeData.light(), // 主题
|
||
routes: {'/details': (c) => DetailsPage()}, // 路由
|
||
debugShowCheckedModeBanner: false, // 隐藏调试条
|
||
)
|
||
|
||
// 页面骨架,包含顶部栏、内容区、悬浮按钮等标准组件。
|
||
Scaffold(
|
||
appBar: AppBar(title: Text('标题')), // 顶部栏
|
||
body: Center(child: Text('内容')), // 主体
|
||
floatingActionButton: FloatingActionButton(
|
||
onPressed: () {}, // 悬浮按钮
|
||
),
|
||
drawer: Drawer(child: Text('侧边栏')), // 抽屉
|
||
bottomNavigationBar: BottomNavigationBar(
|
||
items: [], // 底部导航
|
||
),
|
||
)
|
||
```
|
||
|
||
# 布局Widget
|
||
```dart
|
||
Container(
|
||
width: 100,
|
||
height: 50,
|
||
margin: EdgeInsets.all(10), // 外边距
|
||
padding: EdgeInsets.all(20), // 内边距
|
||
decoration: BoxDecoration(
|
||
color: Colors.blue, // 背景色
|
||
borderRadius: BorderRadius.circular(10), // 圆角
|
||
border: Border.all(color: Colors.black), // 边框
|
||
),
|
||
child: Text('内容'),
|
||
)
|
||
|
||
Row(
|
||
mainAxisAlignment: MainAxisAlignment.spaceBetween, // 主轴对齐
|
||
crossAxisAlignment: CrossAxisAlignment.center, // 交叉轴对齐
|
||
children: [Text('左'),Text('中'),Text('右')],
|
||
)
|
||
|
||
Column(
|
||
children: [
|
||
Expanded(child: Container(color: Colors.red)), // 扩展
|
||
Flexible(child: Container(color: Colors.blue)), // 灵活
|
||
],
|
||
)
|
||
|
||
// 层叠布局,用于重叠显示 Widget,配合 Positioned 定位。
|
||
Stack(
|
||
children: [
|
||
Container(color: Colors.red, width: 200, height: 200), // 底层
|
||
Positioned( // 绝对定位
|
||
top: 20,
|
||
left: 20,
|
||
child: Text('重叠内容'),
|
||
),
|
||
],
|
||
)
|
||
|
||
Row(
|
||
children: [
|
||
Text('左'),
|
||
Spacer(), // 自动占据剩余空间
|
||
Text('右'),
|
||
],
|
||
)
|
||
|
||
Row(
|
||
children: [
|
||
Expanded(
|
||
flex: 2, // 权重
|
||
child: Container(color: Colors.red),
|
||
),
|
||
Expanded(
|
||
flex: 1,
|
||
child: Container(color: Colors.blue),
|
||
),
|
||
],
|
||
)
|
||
```
|
||
|
||
# 列表和网格
|
||
```dart
|
||
ListView(
|
||
children: List.generate(20, (i) => ListTile(
|
||
title: Text('项目 $i'), // 列表项
|
||
)),
|
||
)
|
||
|
||
// 懒加载版本(推荐)
|
||
ListView.builder(
|
||
itemCount: 1000,
|
||
itemBuilder: (context, index) => ListTile(
|
||
title: Text('项目 $index'),
|
||
),
|
||
)
|
||
|
||
GridView.count(
|
||
crossAxisCount: 2, // 每行数量
|
||
children: List.generate(20, (i) => Container(
|
||
color: Colors.blue,
|
||
child: Center(child: Text('$i')),
|
||
)),
|
||
)
|
||
```
|
||
|
||
# 展示 Widget
|
||
```dart
|
||
Text(
|
||
'Hello Flutter',
|
||
style: TextStyle(
|
||
fontSize: 20,
|
||
color: Colors.blue,
|
||
fontWeight: FontWeight.bold,
|
||
),
|
||
textAlign: TextAlign.center,
|
||
)
|
||
|
||
Image.network(
|
||
'https://example.com/image.jpg',
|
||
width: 100,
|
||
height: 100,
|
||
fit: BoxFit.cover, // 填充方式
|
||
loadingBuilder: (c, child, progress) {
|
||
if (progress == null) return child;
|
||
return CircularProgressIndicator();
|
||
},
|
||
)
|
||
|
||
Icon(
|
||
Icons.favorite,
|
||
color: Colors.red,
|
||
size: 30,
|
||
)
|
||
```
|
||
|
||
# 对话框Widget
|
||
```dart
|
||
// 提示对话框,showDialog 显示,需要 context。
|
||
showDialog(
|
||
context: context,
|
||
builder: (context) => AlertDialog(
|
||
title: Text('提示'),
|
||
content: Text('确定删除吗?'),
|
||
actions: [
|
||
TextButton(
|
||
onPressed: () => Navigator.pop(context),
|
||
child: Text('取消'),
|
||
),
|
||
TextButton(
|
||
onPressed: () => Navigator.pop(context),
|
||
child: Text('确定'),
|
||
),
|
||
],
|
||
),
|
||
)
|
||
|
||
// 底部弹出表单
|
||
showModalBottomSheet(
|
||
context: context,
|
||
builder: (context) => Container(
|
||
height: 200,
|
||
child: ListView(
|
||
children: [],
|
||
),
|
||
),
|
||
)
|
||
|
||
// 底部轻提示,不打断用户操作
|
||
ScaffoldMessenger.of(context).showSnackBar(
|
||
SnackBar(
|
||
content: Text('操作成功'),
|
||
action: SnackBarAction(
|
||
label: '撤销',
|
||
onPressed: () {},
|
||
),
|
||
duration: Duration(seconds: 2),
|
||
),
|
||
)
|
||
```
|
||
|
||
# 导航和路由
|
||
```dart
|
||
Navigator.push( // 跳转
|
||
context,
|
||
MaterialPageRoute(builder: (c) => DetailsPage()),
|
||
);
|
||
|
||
Navigator.pop(context); // 返回
|
||
Navigator.pushNamed(context, '/details'); // 命名路由
|
||
|
||
// 页面切换器
|
||
PageView(
|
||
children: [
|
||
Page1(),
|
||
Page2(),
|
||
Page3(),
|
||
],
|
||
controller: PageController(),
|
||
onPageChanged: (index) => print('切换到 $index'),
|
||
)
|
||
```
|
||
|
||
# 手势Widget
|
||
```dart
|
||
GestureDetector(
|
||
onTap: () => print('点击'),
|
||
onDoubleTap: () => print('双击'),
|
||
onLongPress: () => print('长按'),
|
||
onPanUpdate: (details) => print('拖拽: ${details.delta}'),
|
||
child: Container(
|
||
width: 100,
|
||
height: 100,
|
||
color: Colors.blue,
|
||
),
|
||
)
|
||
|
||
InkWell(
|
||
onTap: () => print('点击'),
|
||
splashColor: Colors.blue.withOpacity(0.3), // 水波纹颜色
|
||
child: Container(
|
||
padding: EdgeInsets.all(20),
|
||
child: Text('可点击区域'),
|
||
),
|
||
)
|
||
```
|
||
|
||
# 其他Widget
|
||
```dart
|
||
// 控制 Widget 显示/隐藏,比条件渲染性能更好。
|
||
Visibility(
|
||
visible: isVisible, // 是否显示
|
||
child: Text('内容'),
|
||
maintainSize: true, // 保持占位
|
||
maintainAnimation: true,
|
||
maintainState: true,
|
||
)
|
||
```
|