首页 > 解决方案 > Flutter:必须在调用 super.dispose() 之前处理 Ticker

问题描述

我不知道为什么控制台框中会出现此错误

控制台消息:

SplashScreenState 通过其 SingleTickerProviderStateMixin 创建了一个 Ticker,但在 mixin 上调用 dispose() 时,该 Ticker 仍然处于活动状态。Ticker 必须在调用 super.dispose() 之前被释放。AnimationControllers 使用的 Ticker 应该通过在 AnimationController 本身上调用 dispose() 来处理。否则,自动收报机将泄漏。有问题的代码是:代码(由 SplashScreenState#dae31(生命周期状态:创建)创建)

这是我的启动画面的完整代码:

import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';


class SplashScreen extends StatefulWidget {
  @override
  SplashScreenState createState() => new SplashScreenState();
}

class SplashScreenState extends State<SplashScreen>
    with SingleTickerProviderStateMixin {
  var _visible = true;

  AnimationController animationController;
  Animation<double> animation;

  startTime() async {
    var _duration = new Duration(seconds: 3);
    return new Timer(_duration, navigationPage);
  }

  void navigationPage() {
    Navigator.of(context).pushReplacementNamed(HOME_SCREEN);
  }




  @override
  void initState() {
    super.initState();
    animationController = new AnimationController(
      vsync: this,
      duration: new Duration(seconds: 2),
    );
    animation =
    new CurvedAnimation(parent: animationController, curve: Curves.easeOut);

    animation.addListener(() => this.setState(() {}));
    animationController.forward();

    setState(() {
      _visible = !_visible;
    });
    startTime();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        fit: StackFit.expand,
        children: <Widget>[

          new Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              new Image.asset(
                'assets/vegan1.png',
                width: animation.value * 280,
                height: animation.value * 280,
              ),
            ],
          ),
        ],
      ),
    );
  }
}


我该如何解决这个错误。如果您有任何解决方案或想法来解决这个问题,请回答。仅添加重要点以减少代码大小。如果您需要更多控制台代码,请发表评论。

标签: flutterdartflutter-layoutflutter-animation

解决方案


覆盖dispose方法并释放AnimationController实例。

@override
dispose() {
  animationController.dispose(); // you need this
  super.dispose();
}

推荐阅读