Flutter 中 Widget 组件状态
·
Flutter 定义 无状态组件类 与 有状态组件类原因是
1,无状态组件 配置渲染一次, 生命周期内都不再重新绘制
2,有状态组件 配置渲染后,随时会重新绘制
3,对于 Flutter 框架来说,不需要重复渲染的组件,定义为无状态类型,可以节省资源、提高项目整体性能。
1. 为什么有些类要继承状态管理类,有些不用?
Flutter组件体系结构
Flutter框架基于组件化设计,提供了两种核心基类:
StatelessWidget(无状态组件)
// 不需要状态管理的场景
class ProfileHeader extends StatelessWidget {
final String username;
final String avatarUrl;
const ProfileHeader({
required this.username,
required this.avatarUrl,
super.key,
});
@override
Widget build(BuildContext context) {
// 只负责展示数据,不涉及状态变化
return Row(
children: [
CircleAvatar(backgroundImage: NetworkImage(avatarUrl)),
Text(username),
],
);
}
}
StatefulWidget(有状态组件)
// 需要状态管理的场景
class LikeButton extends StatefulWidget {
const LikeButton({super.key});
@override
State<LikeButton> createState() => _LikeButtonState();
}
class _LikeButtonState extends State<LikeButton> {
// 状态变量 - 会变化的数据
bool _isLiked = false;
int _likeCount = 0;
// 状态改变方法
void _toggleLike() {
setState(() {
_isLiked = !_isLiked;
_likeCount += _isLiked ? 1 : -1;
});
}
@override
Widget build(BuildContext context) {
// 根据状态构建UI
return IconButton(
icon: Icon(
_isLiked ? Icons.favorite : Icons.favorite_border,
color: _isLiked ? Colors.red : null,
),
onPressed: _toggleLike, // 触发状态改变
);
}
}
选择标准
| 场景 | 继承类 | 原因 |
| 纯展示数据 | StatelessWidget | 数据固定,无需交互 |
| 用户交互 | StatefulWidget | 需要响应点击、滑动等操作 |
| 动画效果 | StatefulWidget | 需要随时间改变状态 |
| 表单输入 | StatefulWidget | 需要管理用户输入状态 |
| 网络请求 | StatefulWidget | 需要管理加载、成功、失败状态 |
2. 为什么写UI界面要继承状态管理类?
Flutter的响应式UI设计理念
// 错误示例 - 试图在StatelessWidget中管理状态
class WrongCounter extends StatelessWidget {
int count = 0; // ❌ 这样做无效!
const WrongCounter({super.key});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () {
count++; // ❌ 点击后UI不会更新
print(count); // 控制台能看到变化,但屏幕上看不到
},
child: Text('计数: $count'), // ❌ 始终显示0
);
}
}
正确的状态管理模式
// 正确示例 - 使用StatefulWidget管理状态
class CorrectCounter extends StatefulWidget {
const CorrectCounter({super.key});
@override
State<CorrectCounter> createState() => _CorrectCounterState();
}
class _CorrectCounterState extends State<CorrectCounter> {
int _count = 0; // ✅ 状态变量
void _increment() {
setState(() {
_count++; // ✅ 通过setState改变状态并触发UI更新
});
}
@override
Widget build(BuildContext context) {
// ✅ 每次_count改变都会重新执行build方法
return ElevatedButton(
onPressed: _increment,
child: Text('计数: $_count'), // ✅ 显示最新的_count值
);
}
}
Flutter状态管理的工作原理
// 简化的Flutter框架内部机制
class Framework {
void handleUserInteraction() {
// 1. 用户点击按钮
// 2. 调用对应的onPressed回调
// 3. 如果是setState调用
void setState(VoidCallback fn) {
// 4. 执行状态更新函数
fn();
// 5. 标记组件需要重建
markNeedsBuild();
// 6. 在下一帧调度重建
scheduleFrame();
}
// 7. 下一帧时调用build方法重建UI
}
}
更多推荐


所有评论(0)