Как сделать так, чтобы функция запускалась только один раз в 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"),
            );
          }
        },
      );

Я хочу реализовать анимацию, но код запускается каждый кадр. как мне это сделать?

0 ответов

Другие вопросы по тегам