Как сделать так, чтобы функция запускалась только один раз в streambuilder
Привет, у вас есть данные, которые поступают из firestore, и я использую конструктор потоков для потоковой передачи данных. но я хочу сделать обратный отсчет на основе логического значения, поступающего из потока, поэтому каждый раз, когда он сбрасывает таймер, он не может считать. Вот код.
StreamBuilder<dynamic>(
stream: _controller.gameDataStream,
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.hasError) {
return Column(
children: [
Text("${snapshot.error}"),
Icon(
Icons.error_outline,
color: Colors.red,
size: 60,
),
],
);
} else if (snapshot.hasData) {
int remainingTime = 30; // this keeps returning to zero because it's a streambuilder
new Future.delayed(Duration.zero, () {
SchedulerBinding.instance.addPostFrameCallback((_) {
_aController.duration = Duration(seconds: remainingTime);
_aController
..addStatusListener((status) {
if (_aController.status == AnimationStatus.dismissed) {
setState(() => remainingTime = 0);
}
// AnimationStatus.values
// print(status);
});
_aController.addListener(() {
setState(() {
Duration duration = _aController.duration * _aController.value;
var t = duration.inSeconds;
remainingTime = t;
});
});
_aController.value = 1.0;
if (_aController.isAnimating) {
_aController.stop(canceled: true);
} else {
_aController.reverse(
from: _aController.value == 0.0 ? 1.0 : _aController.value);
}
});
});
}else {
return SizedBox(
child: Text("No Data"),
);
}
},
);
Я хочу реализовать анимацию, но код запускается каждый кадр. как мне это сделать?