如何在Flutter中运行计时器?

时间:2019-11-23 06:58:31

标签: android ios flutter dart

我想在我的应用程序中实现一个计时器。从0开始计数,依此类推。如果用户杀死了该应用程序,然后再次打开,我想继续计算我杀死的位置。谁可以帮我这个事。谢谢。

例如:

  • 用户按下了开始按钮,现在计数从 00:00 开始。
  • 用户在00:20秒处终止应用程序
  • 同样当用户打开应用程序时,计时器应以 00:21
  • 开始

1 个答案:

答案 0 :(得分:1)

这是使用shared_preferencesTimer的简单解决方案。

const String _kTimeKey = 'time_s';

Future<void> main() async {
  final prefs = await SharedPreferences.getInstance();
  runApp(MyApp(dbTime: prefs.getInt(_kTimeKey)));
}

class MyApp extends StatefulWidget {
  final int dbTime;

  const MyApp({Key key, this.dbTime}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  SharedPreferences _prefs;
  Timer _timer;
  int _currentSeconds;

  Future<void> _saveValue() async {
    await _prefs.setInt(_kTimeKey, _currentSeconds);
    _timer?.cancel();
    _timer = null;
  }

  @override
  void initState() {
    super.initState();  
    _currentSeconds = widget.dbTime ?? 0;
    _timer = Timer.periodic(Duration(seconds: 1), (_) => setState(() => _currentSeconds++));
    SharedPreferences.getInstance().then((prefs) async {
      _prefs = prefs;
    });
  }

  @override
  Future<void> dispose() async {
    await _saveValue();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: WillPopScope(
          onWillPop: () async {
            await _saveValue();
            return true;
          },
          child: Center(
            child: Text(
              '$_currentSeconds',
              style: TextStyle(fontSize: 50),
            ),
          ),
        ),
      ),
    );
  }
}