Flutter多功能定时器插件versatile_timer的使用
Flutter多功能定时器插件versatile_timer的使用
VersatileTimer
是一个设计用于支持多种需要定时事件流的场景的插件。它提供了许多常见的功能,以及一些选项来确定从给定输入生成的输出 'ticks'
的方式。
常见功能
- 定时器的启动、停止、暂停和恢复
- 可配置的
'tick'
时间间隔 - 运行时更改速度(即更改
'tick'
时间间隔) - 监听定时器状态
- 用户可定义的转换器,用于在输出之前修改输入,或者静音它(防止其输出)
- 单个配置可以重复执行 n 次,或连续运行
特定功能
这些功能由不同的 TickFilter
实现提供,并支持以下主要类别:
- 固定输入
<FixedInputFilter>
:用户定义单个输入值 - 数据输入:
<IndexedFilter>
:用户提供一个数据列表,定时器使用计数作为索引来查找数据 - 模式输入:
<PatternFilter>
:用户提供的配置定义模式,输出从该模式生成。这是一种从静态输入生成结构化输出的非常灵活的方法
注意,所有这些都支持使用转换器来修改输入和/或静音选定的 'ticks'
,从而防止它们被输出。
使用方法
要监控定时器的输出,可以使用类似以下代码:
class ExampleMonitor<IN, OUT> {
ExampleMonitor(this.timer);
final VersatileTimer<IN, OUT> timer;
int count = 0;
void monitor(Stream<OUT> stream) {
stream.listen((data) {
count++;
// 忽略无操作的原始操作
print(data.toString());
});
}
}
固定输入
以下示例将生成一个每 10 毫秒一次的 'tick'
流,每个 'tick'
是当前 $count
。只输出那些 $count
为奇数的 'tick'
,因此实际输出将是 50 个 'tick'
,每个间隔 20 毫秒。在这里,inputValue
是无关紧要的,因为转换器不使用它,但在其他情况下,它通常会用作输出的一部分。
class OddNumbersOnly implements FixedTransform<int, int> {
@override
int? transform({required int count, required int input}) {
final int r = count % 2;
return r == 0 ? null : count;
}
}
Future<void> main() async {
final timer = FixedTimer<String, String>(
tickInterval: const Duration(milliseconds: 10),
inputValue: '1',
maxTicks: 100,
transformer: OddNumbersOnly(),
);
final monitor = ExampleMonitor<String, String>(timer);
monitor.monitor(timer.output);
await timer.start();
await timer.waitUntilFinished();
}
数据输入
此实现以数据列表作为输入,然后使用定时器读取项目并输出项目,通过可选的转换器。定时器的整体计数用作查找数据项目的索引。如果没有转换器,如这里所示,数据会直接传递到输出。
Future<void> main() async {
final timer = IndexedTimer<Data, Data>(
data: const [
Data(quantity: 1, product: 'a'),
Data(quantity: 2, product: 'b'),
Data(quantity: 3, product: 'c'),
],
tickInterval: const Duration(milliseconds: 100),
);
final monitor = ExampleMonitor<Data, Data>(timer);
monitor.monitor(timer.output);
await timer.start();
await timer.waitUntilFinished();
}
模式输入
此方法使用 PatternConfig
定义潜在的深度嵌套结构作为输出模式。这可以用来生成复杂的输出,根据需要重复某些部分。WeightedTimer
提供了一个很好的例子,它输出具有可变 'weight'
的值的流。
Future<void> main() async {
final timer = WeightedTimer<Weight>(
tickInterval: const Duration(milliseconds: 100),
config: const WeightedConfig(
repeat: 2,
pattern: [
Group(
label: 'Group A',
pattern: [
Group(label: 'Group B',
pattern: [
Weight(10, repeat: 3, label: 'step B1'),
Weight(20, repeat: 2, label: 'step B2'),
],
),
Weight(1, repeat: 2, label: 'step A1'),
Weight(3, repeat: 4, label: 'step A2'),
],
),
],
),
transformer: const WeightTransformer(),
);
final monitor = ExampleMonitor<Weight, Weight>(timer);
monitor.monitor(timer.output);
await timer.start();
await timer.waitUntilFinished();
}
更多关于Flutter多功能定时器插件versatile_timer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter多功能定时器插件versatile_timer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
versatile_timer
是一个 Flutter 插件,用于创建和管理多功能定时器。它支持多种定时器类型,如倒计时、循环定时器等,并且提供了丰富的配置选项。以下是如何使用 versatile_timer
插件的基本步骤。
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 versatile_timer
插件的依赖:
dependencies:
flutter:
sdk: flutter
versatile_timer: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入插件
在需要使用定时器的 Dart 文件中导入 versatile_timer
插件:
import 'package:versatile_timer/versatile_timer.dart';
3. 创建定时器
你可以使用 VersatileTimer
类来创建和管理定时器。以下是一些常见的用法示例。
3.1 创建倒计时定时器
void startCountdownTimer() {
final timer = VersatileTimer(
duration: Duration(seconds: 10), // 10秒倒计时
onTick: (Duration remaining) {
print('剩余时间: $remaining');
},
onFinish: () {
print('倒计时结束');
},
);
timer.start();
}
3.2 创建循环定时器
void startRepeatingTimer() {
final timer = VersatileTimer(
duration: Duration(seconds: 5), // 每5秒触发一次
repeat: true, // 设置为循环定时器
onTick: (Duration elapsed) {
print('已过去时间: $elapsed');
},
);
timer.start();
}
3.3 暂停和恢复定时器
void pauseAndResumeTimer() {
final timer = VersatileTimer(
duration: Duration(seconds: 10),
onTick: (Duration remaining) {
print('剩余时间: $remaining');
},
onFinish: () {
print('定时器结束');
},
);
timer.start();
Future.delayed(Duration(seconds: 5), () {
timer.pause();
print('定时器已暂停');
Future.delayed(Duration(seconds: 2), () {
timer.resume();
print('定时器已恢复');
});
});
}
3.4 取消定时器
void cancelTimer() {
final timer = VersatileTimer(
duration: Duration(seconds: 10),
onTick: (Duration remaining) {
print('剩余时间: $remaining');
},
onFinish: () {
print('定时器结束');
},
);
timer.start();
Future.delayed(Duration(seconds: 5), () {
timer.cancel();
print('定时器已取消');
});
}
4. 处理定时器状态
VersatileTimer
提供了多种方法来处理定时器的状态,如 start()
、pause()
、resume()
和 cancel()
。你还可以通过 isRunning
、isPaused
和 isFinished
属性来检查定时器的当前状态。
5. 处理定时器事件
VersatileTimer
提供了多个回调函数来处理定时器事件:
onTick
: 每次定时器触发时调用。onFinish
: 定时器结束时调用。onPause
: 定时器暂停时调用。onResume
: 定时器恢复时调用。onCancel
: 定时器取消时调用。
6. 完整示例
以下是一个完整的示例,展示了如何使用 versatile_timer
插件创建一个倒计时定时器:
import 'package:flutter/material.dart';
import 'package:versatile_timer/versatile_timer.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: TimerExample(),
);
}
}
class TimerExample extends StatefulWidget {
[@override](/user/override)
_TimerExampleState createState() => _TimerExampleState();
}
class _TimerExampleState extends State<TimerExample> {
VersatileTimer? _timer;
Duration _remainingTime = Duration(seconds: 10);
void startTimer() {
_timer = VersatileTimer(
duration: Duration(seconds: 10),
onTick: (Duration remaining) {
setState(() {
_remainingTime = remaining;
});
},
onFinish: () {
setState(() {
_remainingTime = Duration.zero;
});
},
);
_timer!.start();
}
[@override](/user/override)
void dispose() {
_timer?.cancel();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Versatile Timer Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('剩余时间: $_remainingTime'),
SizedBox(height: 20),
ElevatedButton(
onPressed: startTimer,
child: Text('开始倒计时'),
),
],
),
),
);
}
}