1、Flutter中常用 Widget
2、StatelessWidget 和 StateFulWidget
- Flutter 中的 widget 有很多,但主要分两种:
StatelessWidget | 无状态的 widget | 如果一个 widget 是最终的或不可变的,那么它就是无状态的 |
---|---|---|
StatefulWidget | 有状态的 widget | 如果一个 widget 会被用户交互或数据导致状态改变,那么它就是有状态的 |
2.1、StatelessWidget
- Text、AboutDialog、CircleAvatar 等都是 StatelessWidget 的子类
无状态 widget 通常会在 3 种情况下使用:
(1) 将 widget 插入树中时
(2) 当 widget 的父级更改配置时
(3) 当它依赖的 InheritedWidget 发生改变时
代码示例
//无状态 widget
class LeonStateLessWidget extends StatelessWidget {
final String text;
const LeonStateLessWidget({super.key, required this.text});
Widget build(BuildContext context) {
return Center(
child: Text(
text,
style: const TextStyle(color: Colors.yellow, fontSize: 26),
),
);
}
}
2.2、StatefulWidget
- TextField、Checkbox、Radio、Form、Slider、InkWell 等都是 StatefulWidget 的子类
- StatefulWidget 使用 setState 方法管理状态变化,调用 setState 方法告诉 Flutter 框架某个状态发生了改变,Flutter 会重新运行 build 方法
- createState() 方法会创建一个管理 widget 状态的状态对象 _xxxState,_xxxState() 类会实现 widget 的 build 方法
代码示例
//有状态 widget
class LeonStatefulWidget extends StatefulWidget {
const LeonStatefulWidget({super.key});
State<LeonStatefulWidget> createState() => _LeonStatefulWidgetState();
}
class _LeonStatefulWidgetState extends State<LeonStatefulWidget> {
var count = 0;
Widget build(BuildContext context) {
return Center(
child: Column(
children: [
Text('点击次数: $count'),
ElevatedButton(onPressed: _onClick, child: const Text('点我'))
],
),
);
}
void _onClick() {
setState(() {
count++;
});
}
}
2.3、代码示例
import 'package:flutter/material.dart';
import 'package:zlzf/widget.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
title: 'Leon Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: const LeonStateLessWidget(
text: 'Widget 学习',
),
),
body: const LeonStatefulWidget()
));
}
}
3、补充
- Flutter 中状态管理的 3 中主要方式:
每个 widget 管理自己的状态 | 如果所讨论的状态是用户数据,例如复选框的已选中或未选中状态,或滑块的位置,则状态最好由父widget管理 |
---|---|
父 widget 管理 widget 的状态 | 如果widget的状态取决于动作,例如动画,那么最好是由widget自身来管理状态 |
混合搭配管理 | 见机行事 |