此篇记录一些踩坑的地方,一些需要注意的点,以及我觉得需要记录的内容

AutomaticKeepAliveClientMixin

这个Mixin主要是用在tab中,如果想要避免切换tab的时候每次都重新初始化State的话,就需要用到这个Mixin。

Mixin的说明里写的很清楚,这个Mixin需要和StatefulWidget搭配使用,如果你想要自动保持状态,在声明class的时候加入这个Mixin

1
Class PageState extends State<Page> with AutomaticKeepAliveClientMixin{}

并且需要实现对应的wantKeepAlive方法

1
2
@override
bool get wantKeepAlive => true;

最后需要在build方法中调用super.build

1
2
3
4
5
@override
Widget build(BuildContext context) {
super.build(context);
return //....
}

这样就完成了tab的自动保持状态,第一次初始化过后,再次切换到这个tab就不会重新初始化状态了。
如果想要改变wantKeepAlive的状态,需要在改变wantKeepAlive的值之后,调用updateKeepAlive方法才可生效。

StatefulBuilder

学习flutter的第一天我们就会学到StatefulWidget和StatelessWidget的区别,如果状态会发生改变的话,必须要使用用StatefulWidget,这样才可以通过setState方法来改变状态,重新调用build方法来改变Widget,以达到更新状态的目的。
我在学习Flutter的过程中遇到了这样的问题,我创建了一个Dialog,但是我显示的内容却并不能根据state改变,经过查询我才知道,如果调用showDialog方法的话,如果不使用StatefulBuilder的话,这个Dialog默认是Stateless的,如果有改变状态的需求的话,就必须使用StatefulBuilder来构建Dialog,为Dialog创建自己的state,然后调用自己的state来改变Dialog的状态,如果调用StatefulWidget的setState方法的话是不能改变Dialog的状态的。

1
2
3
4
5
6
7
8
9
10
11
// 普通的dialog
void _showDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return CupertinoAlertDialog(
// ...
);
},
);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Stateful Dialog
void _showDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context, state) {
return CupertinoAlertDialog(
// ...
)
);
},
);
)
}

需要改变状态时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void _showDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (context, state) {
return CupertinoAlertDialog(
// ...
state(() {
obj = value;
})
// ...
)
);
},
);
)
}