我正在使用 AnimationController 为小部件制作动画(小部件是所附图像中显示的红色波浪)。在用户点击红色按钮说话后,小部件开始visibility = false
并在 10 秒内变为真。我面临的问题是第二次点击红色按钮时出现错误:
AnimationController.stop() 在 AnimationController.dispose() 之后调用。
并且该小部件再也不会显示。由于我没有处理只是隐藏它的小部件,我无法理解发生了什么。到目前为止我已经尝试过:
- 创建
_controller
外部/内部小部件构建。 - 在调用它之前检查小部件是否已安装
- 只要小部件被隐藏,就将状态更改
AnimationController
为 false。
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
var _controller;
var spinkitWave;
stt.SpeechToText speech = stt.SpeechToText();
@override
void initState() {
super.initState();
_controller = AnimationController(vsync:this, duration: Duration(seconds:1), lowerBound:0, upperBound:0.1)
..addStatusListener((status) {
if (status == AnimationStatus.completed) {
if (mounted) {
_controller.reverse();
}
}});
@override
dispose() {
_controller.dispose(); // you need this
super.dispose();
}
void startListening() {
_controller = AnimationController(vsync:this, duration: Duration(seconds:1), lowerBound:0, upperBound:0.1);
speech.listen(onResult: resultListener,
onSoundLevelChange: soundLevelListener,
cancelOnError: true,);
setState(() {});
}
@override
Widget build(BuildContext context) {
spinkitWave = SpinKitWave(
color: Colors.redAccent,
type: SpinKitWaveType.center,
controller: _controller,
);
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.red,
),
home: Builder(
builder: (context) => Scaffold(
appBar: AppBar(
title: Text("Leurebeng"),
),
body: Center(
Positioned(
bottom: 10,
child: Stack(
alignment: AlignmentDirectional.bottomCenter,
children: <Widget>[
SizedBox
width: 110.0,
height: 110.0,
child: Visibility(
visible: !speech.isListening,
child: FloatingActionButton(
onPressed:
_available ? startListening : initSpeechState,
tooltip: 'Increment',
child: Icon(Icons.mic),
),
),
),
Visibility(
visible: speech.isListening, //Turns true or false after red button pressed
child:
spinkitWave
),
]),
),
),
),
);
}
}
}