如何热装状态字段?

时间:2018-09-10 10:04:51

标签: flutter

如何在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();
  }
}

1 个答案:

答案 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的持续时间。