flutter怎么全局计时
时间: 2023-07-31 20:09:35 浏览: 107
Flutter倒计时/计时器的实现代码
在Flutter中实现全局计时可以使用`Ticker`类和`TickerProvider`类。下面是一个简单的例子:
1. 创建一个`CountdownTimer`类,该类将使用`Ticker`来定时更新计时器。
```dart
class CountdownTimer {
StreamController<int> _streamController;
int _countdownTime = 0;
Ticker _ticker;
CountdownTimer() {
_streamController = StreamController<int>();
_ticker = Ticker(_onTick);
}
Stream<int> get stream => _streamController.stream;
void start(int countdownTime) {
_countdownTime = countdownTime;
_ticker.start();
}
void _onTick(Duration duration) {
_countdownTime--;
_streamController.add(_countdownTime);
if (_countdownTime <= 0) {
_ticker.stop();
_streamController.close();
}
}
void dispose() {
_ticker.dispose();
_streamController.close();
}
}
```
2. 在`main.dart`中,创建一个`StatefulWidget`,并用`CountdownTimer`类来实现全局计时。
```dart
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
CountdownTimer _countdownTimer;
@override
void initState() {
super.initState();
_countdownTimer = CountdownTimer();
_countdownTimer.stream.listen((countdownTime) {
setState(() {
// 更新UI
});
});
}
@override
void dispose() {
_countdownTimer.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Text(
_countdownTimer._countdownTime.toString(),
style: Theme.of(context).textTheme.headline4,
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
_countdownTimer.start(60); // 开始计时,60秒
},
tooltip: 'Start',
child: Icon(Icons.play_arrow),
),
);
}
}
```
在这个例子中,我们使用了Flutter的`Stream`和`StreamController`来实现计时器的更新。`CountdownTimer`类通过Ticker定时器来更新计时器,并且使用Stream和StreamController来将更新通知给UI。在`main.dart`中,我们创建了一个带有`TickerProviderStateMixin`的`StatefulWidget`,以便我们可以使用Flutter的`Ticker`类。我们还通过监听`CountdownTimer`类的流来更新UI。最后,在`floatingActionButton`的`onPressed`回调中,我们开始了计时器,并将其设置为60秒。
阅读全文