异常信息
背景:在弹窗上,含有一个动画控件,并且使用动回掉实现一些处理。当关闭弹窗时出现如下异常:
flutter exception detail-‘package:flutter/src/widgets/framework.dart’: Failed assertion: line 4109 pos 12: ‘_lifecycleState != _ElementLifecycle.defunct’: is not true. W/flutter exception detail(28505): ‘package:flutter/src/widgets/framework.dart’: Failed assertion: line 4109 pos 12: ‘_lifecycleState != _ElementLifecycle.defunct’: is not true. I/flutter (28505): flutter exception detail-dart:core-patch/errors_patch.dart 46:39 in _AssertionError._doThrowNew I/flutter (28505): flutter exception detail-dart:core-patch/errors_patch.dart 36:5 in _AssertionError._throwNew I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 4109:12 in Element.markNeedsBuild W/flutter exception detail(28505): dart:core-patch/errors_patch.dart 46:39 in _AssertionError._doThrowNew I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 1287:15 in State.setState I/flutter (28505): flutter exception ************box_dialog.dart 128:7 in _MysteryBoxState._animListener I/flutter (28505): flutter exception detail-package:flutter/src/animation/listener_helpers.dart 136:19 in AnimationLocalListenersMixin.notifyListeners W/flutter exception detail(28505): dart:core-patch/errors_patch.dart 36:5 in _AssertionError._throwNew I/flutter (28505): flutter exception detail-package:svgaplayer_flutter/player.dart 65:10 in SVGAAnimationController.clear I/flutter (28505): flutter exception detail-package:svgaplayer_flutter/player.dart 47:5 in SVGAAnimationController.videoItem= I/flutter (28505): flutter exception detail-package:svgaplayer_flutter/player.dart 77:5 in SVGAAnimationController.dispose W/flutter exception detail(28505): package:flutter/src/widgets/framework.dart 4109:12 in Element.markNeedsBuild I/flutter (28505): flutter exception ************box_dialog.dart 145:22 in _MysteryBoxState.dispose I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 4721:11 in StatefulElement.unmount I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 2022:13 in _InactiveElements._unmount W/flutter exception detail(28505): package:flutter/src/widgets/framework.dart 1287:15 in State.setState I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 2020:7 in _InactiveElements._unmount. I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 4549:14 in ComponentElement.visitChildren I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 2018:13 in _InactiveElements._unmount I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 2020:7 in _InactiveElements._unmount. W/flutter exception detail(28505): *********box_dialog.dart 128:7 in _MysteryBoxState._animListener I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 5961:14 in SingleChildRenderObjectElement.visitChildren I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 2018:13 in _InactiveElements._unmount W/flutter exception detail(28505): package:flutter/src/animation/listener_helpers.dart 136:19 in AnimationLocalListenersMixin.notifyListeners I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 2020:7 in _InactiveElements._unmount. I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 4549:14 in ComponentElement.visitChildren I/flutter (28505): flutter exception detail-package:flutter/src/widgets/framework.dart 2018:13 in _InactiveElements._unmount W/flutter exception detail(28505): package:svgaplayer_flutter/player.dart 65:10 in SVGAAnimationController.clear
动画的实现方案
@override
void initState() {
super.initState();
this._svgaController = SVGAAnimationController(vsync: this);
loadAnimation();
}
void loadAnimation() async {
this._svgaController.addListener(() { //TODO });
this._svgaController.addStatusListener((status) {//TODO });
}
@override
void dispose() {
_svgaController?.dispose();
super.dispose();
}
解决方案
@override
void initState() {
super.initState();
this._svgaController = SVGAAnimationController(vsync: this);
loadAnimation();
}
void loadAnimation() async {
this._svgaController.addListener(_animListener);
this._svgaController.addStatusListener(_animStatusListener);
}
void _animListener() {
//TODO
}
void _animStatusListener(AnimationStatus status) {
//TODO
}
@override
void dispose() {
_svgaController?.removeListener(_animListener);
_svgaController?.removeStatusListener(_animStatusListener);
_svgaController?.dispose();
super.dispose();
}
|