如何在Flutter中热重载State
子类的字段?
我知道在热重装期间不考虑修改字段的初始值,并且可以对它们使用热重装。但这太慢了。
有什么方法可以简化这一过程吗?
一个典型的用例是动画,尤其是AnimationController
。由于它存储在State字段中,但我们通常希望在其持续时间内进行迭代。示例:
class MyAnim extends StatefulWidget {
@override
_MyAnimState createState() => _MyAnimState();
}
class _MyAnimState extends State<MyAnim> with SingleTickerProviderStateMixin {
AnimationController animationController;
@override
void initState() {
animationController =
AnimationController(vsync: this, duration: const Duration(seconds: 1));
super.initState();
}
@override
void dispose() {
animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
答案 0 :(得分:4)
State为热重载提供了自定义生命周期挂钩:reassemble
您可以自由地重写该方法以具有自定义的热重载行为。不用担心,永远不会在生产中调用此方法。
稍作调整,您将获得以下信息:
class _MyAnimState extends State<MyAnim> with SingleTickerProviderStateMixin {
AnimationController animationController;
@override
void initState() {
animationController = AnimationController(vsync: this);
_initializeFields();
super.initState();
}
void _initializeFields() {
animationController.duration = const Duration(seconds: 1);
}
@override
void reassemble() {
_initializeFields();
super.reassemble();
}
@override
void dispose() {
animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
现在,每当您修改State类时,它将正确更新AnimationController
的持续时间。