Flutter多功能定时器插件versatile_timer的使用

发布于 1周前 作者 ionicwang 来自 Flutter

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

1 回复

更多关于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()。你还可以通过 isRunningisPausedisFinished 属性来检查定时器的当前状态。

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('开始倒计时'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!