暂停颤振倒数计时器

时间:2019-03-27 18:35:15

标签: dart flutter

我一直在玩Dart Timer Class,让它以最基本的形式工作,但是我一直在尝试向其添加暂停功能。我查看了他们的文档,但是他们对Timer类的了解不多...

有什么方法可以暂停和恢复点击时的计时器/倒数?这是我到目前为止所取得的成就:

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

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

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

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

  final String title;

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


class _MyHomePageState extends State<MyHomePage> {

  Timer _timer;
  int _start = 10;

  void startTimer() {
    const oneSec = const Duration(seconds: 1);
    _timer = new Timer.periodic(
        oneSec,
            (Timer timer) => setState(() {
          if (_start < 1) {
            timer.cancel();
          } else {
            _start = _start - 1;
          }
        }));
  }


  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: AppBar(title: Text("Timer test")),
        body: Column(
          children: <Widget>[
            RaisedButton(
              onPressed: () {
                startTimer();
              },
              child: Text("start"),
            ),
            Text("$_start")
          ],
        ));
  }
}

3 个答案:

答案 0 :(得分:0)

没有内置的pause函数,因为Timer类主要用于调度代码块供以后使用。

您的用例是什么? Stopwatch类具有暂停和恢复功能。

答案 1 :(得分:0)

具有抖动和振动的颤振示例如下(source

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

void main() => runApp(MaterialApp(home: CountdownCard()));

class CountdownCard extends StatefulWidget {
// This widget is the root of your application.

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

class _CountdownCardState extends State<CountdownCard> {
Timer _timer;
int _start = 0;
bool _vibrationActive = false;

void startTimer(int timerDuration) {
    if (_timer != null) {
    _timer.cancel();
    cancelVibrate();
    }
    setState(() {
    _start = timerDuration;
    });
    const oneSec = const Duration(seconds: 1);
    print('test');
    _timer = new Timer.periodic(
    oneSec,
    (Timer timer) => setState(
        () {
        if (_start < 1) {
            timer.cancel();
            print('alarm');
            vibrate();
        } else {
            _start = _start - 1;
        }
        },
    ),
    );
}

void cancelVibrate() {
    _vibrationActive = false;
    Vibration.cancel();
}

void vibrate() async {
    _vibrationActive = true;
    if (await Vibration.hasVibrator()) {
    while (_vibrationActive) {
        Vibration.vibrate(duration: 1000);
        await Future.delayed(Duration(seconds: 2));
    }
    }
}

void pauseTimer() {
    if (_timer != null) _timer.cancel();
}

void unpauseTimer() => startTimer(_start);

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

@override
Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
        title: Text('Countdown'),
        ),
        body: Wrap(children: <Widget>[
        Column(
            children: <Widget>[
            RaisedButton(
                onPressed: () {
                startTimer(10);
                },
                child: Text("start"),
            ),
            Text("$_start"),
            RaisedButton(
                onPressed: () {
                pauseTimer();
                },
                child: Text("pause"),
            ),
            RaisedButton(
                onPressed: () {
                unpauseTimer();
                },
                child: Text("unpause"),
            ),
            RaisedButton(
                onPressed: () {
                cancelVibrate();
                },
                child: Text("stop alarm"),
            ),
            ],
        ),
        ]));
}
}

答案 2 :(得分:0)

我刚刚上传了此程序包以实现此功能:https://pub.dev/packages/pausable_timer

// It starts paused
final timer = PausableTimer(Duration(seconds: 1), () => print('Fired!'));
timer.start();
timer.pause();
timer.start();

还有一个issue requesting the feature in Dart itself,但看起来不会很快添加。