簡體   English   中英

暫停顫振倒數計時器

[英]Pause Flutter Countdown Timer

我一直在玩 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")
          ],
        ));
  }
}

沒有內置的pause功能,因為Timer類主要用於為以后調度代碼塊。

你的用例是什么? Stopwatch類具有暫停和恢復功能。

帶有暫停和振動的工作顫振示例如下( 來源

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"),
            ),
            ],
        ),
        ]));
}
}

我剛剛上傳了這個包來實現這個: https : //pub.dev/packages/pausable_timer

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

Dart 本身也存在請求該功能問題,但看起來不會很快添加。

我們在頁面打開時定義啟動計時器的變量。 頁面關閉時計時器關閉。

如果觸摸屏幕,可變持續時間變為真,計時器停止倒計時

     Timer? _timer;
     int _start = 200;
     bool duration = false;
     Duration oneSec = const Duration(milliseconds: 10);
    

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    startTimer();
  }

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

 ```
    GestureDetector(
              onTap: () {},
              onTapDown: (e) {
                setState(() {
                  duration = true;
                });
              },
              onHorizontalDragEnd: (e) {
                Navigator.pop(context);
              },
              onTapUp: (e) {
                setState(() {
                  duration = false;
                });
              },
              child:Text("demo page")}
  void startTimer() {
    _timer = new Timer.periodic(
      oneSec,
      (Timer timer) {
        if (_start == 0) {
          setState(() {
            timer.cancel();
            Navigator.pop(context);
          });
        } else {
          setState(() {
            duration == false ? _start-- : null;
          });
        }
      },
    );
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM