万物皆 Widget?打破 Android/iOS 开发思维,重新理解 Flutter 的“声明式 UI”
·
Flutter基础概念完全指南
🎯 什么是Flutter?
想象一下,如果你要建造一座房子,传统的方式是为不同的房间(iOS、Android、Web)分别设计和建造。而Flutter就像是一个神奇的建筑工具,让你只需要设计一次,就能同时建造出适合所有平台的房子。
Flutter是Google开发的UI工具包,用于从单一代码库构建漂亮的、原生编译的移动、Web和桌面应用程序。
Flutter的核心优势
- 一次编写,到处运行:就像万能钥匙,一把钥匙开所有门
- 热重载:就像魔法,代码改动立即生效
- 高性能:直接编译成原生代码,性能接近原生应用
- 丰富的UI组件:就像乐高积木,各种组件任你组合
🧱 第一章:Widget概念理解

1.1 一切皆Widget的思想
在Flutter中,一切都是Widget!这就像在现实世界中,一切都是由原子组成的一样。
// 想象Widget就像搭积木
// 每个积木块都是一个Widget
// 大的积木可以包含小的积木
// 一个简单的应用就是这样组成的:
MyApp (最大的积木)
├── MaterialApp (应用框架积木)
└── Scaffold (页面结构积木)
├── AppBar (顶部栏积木)
└── Body (主体积木)
└── Text (文字积木)
1.2 Widget就像现实中的物品
让我们用现实生活中的例子来理解Widget:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
title: '我的第一个Flutter应用',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
// AppBar就像房子的屋顶
appBar: AppBar(
title: Text('欢迎来到Flutter世界'),
backgroundColor: Colors.blue,
),
// Body就像房子的主体部分
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Text就像房间里的标语牌
Text(
'你好,Flutter!',
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: Colors.blue,
),
),
SizedBox(height: 20), // 就像两个家具之间的空隙
// Icon就像装饰品
Icon(
Icons.favorite,
color: Colors.red,
size: 50,
),
],
),
),
);
}
}
1.3 StatelessWidget vs StatefulWidget
这就像现实中的静态物品和动态物品的区别:
StatelessWidget - 静态物品
就像一幅画、一个雕塑,一旦创建就不会改变:
// 就像一个永远不变的标语牌
class WelcomeSign extends StatelessWidget {
final String message;
WelcomeSign({required this.message});
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.blue[100],
borderRadius: BorderRadius.circular(8),
),
child: Text(
message,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
);
}
}
StatefulWidget - 动态物品
就像一个时钟、一个开关,状态会发生变化:
// 就像一个可以开关的灯
class ToggleLight extends StatefulWidget {
_ToggleLightState createState() => _ToggleLightState();
}
class _ToggleLightState extends State<ToggleLight> {
bool isLightOn = false; // 灯的状态:开或关
Widget build(BuildContext context) {
return Column(
children: [
// 灯泡图标,根据状态显示不同颜色
Icon(
Icons.lightbulb,
size: 100,
color: isLightOn ? Colors.yellow : Colors.grey,
),
SizedBox(height: 20),
// 开关按钮
ElevatedButton(
onPressed: () {
setState(() {
isLightOn = !isLightOn; // 切换灯的状态
});
},
child: Text(isLightOn ? '关灯' : '开灯'),
),
// 状态文字
Text(
'灯现在是${isLightOn ? "开着的" : "关着的"}',
style: TextStyle(fontSize: 16),
),
],
);
}
}
1.4 Widget树的概念
Widget树就像家族族谱,每个Widget都有自己的父母和孩子:
// 想象这是一个家庭结构
MaterialApp (爷爷)
└── Scaffold (爸爸)
├── AppBar (大儿子)
│ └── Text (孙子)
└── Body (二儿子)
└── Column (孙子)
├── Text (曾孙)
├── Icon (曾孙)
└── Button (曾孙)
实际代码示例:
class FamilyTreeExample extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp( // 爷爷级别
home: Scaffold( // 爸爸级别
appBar: AppBar( // 大儿子
title: Text('家族树示例'), // 孙子
),
body: Column( // 二儿子
children: [ // 孙子们
Text('我是第一个孙子'), // 曾孙1
Icon(Icons.family_restroom), // 曾孙2
ElevatedButton( // 曾孙3
onPressed: () {},
child: Text('我是按钮'),
),
],
),
),
);
}
}
每篇文章并不长,这个系列是由浅到深来设计的。如果文章对您有帮助,麻烦动动发财的小手点赞、关注和收藏,您的反馈将是作者不断更新的动力🙏🏻
更多推荐


所有评论(0)