Добавьте время к таймеру обратного отсчета во время обратного отсчета во Flutter

Я пытаюсь создать приложение таймера обратного отсчета, в котором я могу нажать кнопку, чтобы добавить больше времени, в то время как таймер активно ведет обратный отсчет, как и каждая микроволновая печь, где есть кнопка, которую вы можете нажать, чтобы добавить дополнительную минуту к ее времени работы, пока она работает, ничего не останавливая.

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class Countdown extends AnimatedWidget {
  Countdown({ Key key, this.animation }) : super(key: key, listenable: animation);
  Animation<int> animation;

  @override
  build(BuildContext context){
    return new Text(
      animation.value.toString(),
      style: new TextStyle(fontSize: 150.0),
    );
  }
}

class MyApp extends StatefulWidget {
  State createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
  AnimationController _controller;

  static const int kStartValue = 4;

  @override
  void initState() {
    super.initState();
    _controller = new AnimationController(
      vsync: this,
      duration: new Duration(seconds: kStartValue),
    );
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.play_arrow),
        onPressed: () => _controller.forward(from: 0.0),
      ),
      body: new Container(
        child: new Center(
          child: new Countdown(
            animation: new StepTween(
              begin: kStartValue,
              end: 0,
            ).animate(_controller),
          ),
        ),
      ),
    );
  }
}

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


person Bbb    schedule 09.01.2019    source источник


Ответы (1)


Я думаю, что нижеприведенное - это то, что вы пытаетесь достичь. Нажатие FloatingActionButton добавляет 5 секунд.

import 'dart:async';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Countdown Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Countdown Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _timeRemaining = 10;
  Timer _timer;

  @override
  void initState() {
    _timer = Timer.periodic(Duration(seconds: 1), (Timer t) => _getTime());
    super.initState();
  }

  @override
  void dispose() {
    _timer?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Text('$_timeRemaining'),
      ),
      floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () {
            _timeRemaining += 5;
          }),
    );
  }

  void _getTime() {
    setState(() {
      _timeRemaining == 0 ? _timeRemaining = 0 : _timeRemaining--;
    });
  }
}
person Albert Lardizabal    schedule 09.01.2019
comment
Не забудьте отменить таймер в dispose (). - person Richard Heap; 10.01.2019
comment
Вы можете подробнее рассказать об этом? - person Bbb; 10.01.2019
comment
Обновлено для отмены экземпляра Timer. - person Albert Lardizabal; 11.01.2019
comment
Я не замечаю никаких изменений в поведении, вы можете объяснить, что в результате? - person Bbb; 11.01.2019
comment
Хорошая практика - избавляться от ресурсов, когда они больше не нужны. Вы можете столкнуться с утечкой памяти, если класс Widget с таймером будет уничтожен / удален без предварительной отмены таймера. - person Albert Lardizabal; 11.01.2019