- 在 Android 中,View 是所有组件的根,所有的控件都是继承 View 而来,而在 Flutter 中,Widget 是所有组件的根。
- 在原生开发中,组件的功能只作为页面展示的元素使用,而在 Flutter 中,所有的内容都是由一个个的 Widget 组成的。
- 在 Flutter 中,Widget 子一级便分为 StatelessWidget 和 StatefulWidget 两种,分别适用无状态页面(静态)与有状态页面(响应式)
一、StatelessWidget
- StatelessWidget 继承于 Widget。
- StatelessWidget 是一个静态的组件,其中的展示内容不会随着数据的变化而变化(非响应式)。
- StatelessWidget 适用于组件数据不会中途发生变化的情况,而且因为它是一个无状态组件,所以性能更优,尽量多的使用 StatelessWidget 而非 StatefulWidget,可以使 Flutter 工程性能显著提升(因为 StatefulWidget 数据每次变化都会刷新布局)。
写法
// 创建一个组件继承于 StatelessWidget
// 该段代码可以输入 stless 快速生成
// 组件名命名使用大驼峰
class Name extends StatelessWidget {
//定义变量
var _name;
//可以通过设置构造函数传递参数进来
//通常 Widget 第一个参数是继承的 Key
name(Key key,this._name):super(key: key);
// build 方法,返回一个 Widget(组件),也就是 name 这个组件的样式
@override
Widget build(BuildContext context) {
//return 后面写布局即可。
//Container 是一个可以放置一个子控件的容器
return Container();
}
}
StatefulWidget
- StatefulWidget 也继承于 Widget。
- StatefulWidget 的特点是可以进行状态管理,数据更新,页面中的内容可以随之变化(响应式)
- StatefulWidget 因为数据更新便要刷新布局,所以性能较弱,尽量在需要更新数据的组件中使用。
写法
//创建组件 Name 继承于 StatefulWidget
//该段代码可以通过 stful 快速生成
class Name extends StatefulWidget {
var _name;
// StatefulWidget 的特点是它是一个有状态的组件,所以这里创建一个 State
@override
_NameState createState() => _NameState();
}
//Name 组件的 State
//该组件的视图、生命周期都交由 State 管理
class _NameState extends State<Name> {
//State初始化的方法
@override
void initState() {
super.initState();
// setState 方法中可以更新数据(响应式精髓)
// setState 之后 build 方法会重新调用,所以尽量不要在 Build 中 return 之前写逻辑
setState(() {
//更新数据,
widget._name = "面包超人";
});
}
//当State对象从树中被永久移除时调用;通常在此回调中释放资源。
@override
void dispose() {
super.dispose();
}
//build 调用时机
//在调用initState()之后。
//在调用didUpdateWidget()之后。
//在调用setState()之后。
//在调用didChangeDependencies()之后。
//在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其它位置之后。
@override
Widget build(BuildContext context) {
return Container(
//在 State 中可以通过 widget 获取到控件中的变量
child: Text(widget._name),
);
}
}