Как установить таймер и соответственно обновить индикатор линейного прогресса - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь выполнить вызов «7 GUI», и мне просто не удается правильно установить таймер при изменении конца ползунка (0-15) секунд.Вы можете найти вызов здесь (Таймер один).Я пытаюсь установить setState внутри обратного вызова, данного мне периодическим таймером в флаттере, но он фактически не обновляет состояние, свойство _secondsValue в состоянии не обновляется.Есть предупреждение, что я не понимаю о том, как setState работает?Я знаю, что вы не можете установить SetState с возвратом в будущем, но это не так, насколько я знаю.Я был бы очень признателен, если бы кто-то мог объяснить , почему setState здесь не работает, и, возможно, если есть лучший способ добиться того, чего я пытаюсь достичь здесь.

Воткод, который я до сих пор оспаривал для Таймера.

import 'dart:async' as flutter;

import 'package:flutter/material.dart';

class Timer extends StatefulWidget {
  Timer({this.title});

  final String title;

  _TimerState createState() => _TimerState();
}

class _TimerState extends State<Timer> {
  int _secondsValue = 0;
  double progressValue = 0;
  Stopwatch watch = new Stopwatch();
  AnimationController animationController;
  Animation<Color> animation;
  flutter.Timer timer;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Material(
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          mainAxisAlignment: MainAxisAlignment.center,
          mainAxisSize: MainAxisSize.max,
          children: <Widget>[
            Text(
              "Duration:",
              style: TextStyle(fontSize: 24),
            ),
            Text("${_secondsValue.toString()} seconds"),
            Slider(
              value: _secondsValue.toDouble(),
              min: 0,
              max: 20,
              onChanged: (double sliderValue) {
                setState(() {
                  _secondsValue = sliderValue.floor();
                });
              },
              onChangeEnd: (double sliderValue) {
                if (timer != null) {
                  // Not sure why onChangeEnd is being called multiple times...
                  // Resetting the timer every time causes issues too
                  return;
                }

                timer = flutter.Timer.periodic(Duration(seconds: 1), (_timer) {
                  if (watch.elapsed.inSeconds > 0 && _secondsValue > 0) {
                    print("calling state overwrite");
                    print(_secondsValue);
                    setState(() {
                      // THIS SET STATE DOESN'T WORK
                      progressValue =
                          watch.elapsed.inSeconds / _secondsValue == 0
                              ? 1
                              : _secondsValue;
                      _secondsValue = _secondsValue - watch.elapsed.inSeconds;
                    });
                  }
                });
                watch.start();
              },
            ),
            LinearProgressIndicator(
              backgroundColor: Colors.red,
              value: progressValue,
              valueColor: AlwaysStoppedAnimation<Color>(Colors.pink),
            )
          ],
        ),
      ),
    );
  }
}
...