Flutter定时构建任务插件timed_builder的使用

Flutter定时构建任务插件timed_builder的使用

timed_builder 是一个用于在指定时间、周期性或动态生成的时间事件上重新构建小部件的 Flutter 插件。它适用于以下场景:

  • 显示某个事件发生以来或即将发生的时间;
  • 模型频繁更新但希望限制 UI 更新频率;
  • 显示当前日期或时间;
  • 小部件的表示依赖于特定的时间事件。

下图展示了 timed_builder 的示例效果:

示例代码

周期性重建

以下示例展示如何每秒更新一次时间显示:

import 'package:timer_builder/timer_builder.dart';

class ClockWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return TimerBuilder.periodic(Duration(seconds: 1),
      builder: (context) {
        return Text("${DateTime.now()}"); // 显示当前时间
      }
    );
  }
}

按计划重建

以下示例展示如何根据指定的开始时间和结束时间动态更新状态:

import 'package:timer_builder/timer_builder.dart';

class StatusIndicator extends StatelessWidget {

  final DateTime startTime;
  final DateTime endTime;
  
  StatusIndicator(this.startTime, this.endTime);
  
  [@override](/user/override)
  Widget build(BuildContext context) {
    return TimerBuilder.scheduled([startTime, endTime],
      builder: (context) {
        final now = DateTime.now();
        final started = now.compareTo(startTime) >= 0;
        final ended = now.compareTo(endTime) >= 0;
        return Text(started ? ended ? "Ended": "Started": "Not Started");
      }
    );
  }
  
}

完整示例

以下是一个完整的示例,展示如何使用 timed_builder 来创建一个倒计时功能,并在倒计时结束后显示提醒信息:

import 'package:flutter/material.dart';
import 'package:timed_builder/timed_builder.dart';

void main() {
  runApp(SampleApp());
}

class SampleApp extends StatefulWidget {
  [@override](/user/override)
  State<StatefulWidget> createState() {
    return SampleAppState();
  }
}

class SampleAppState extends State<SampleApp> {
  late DateTime alert;

  [@override](/user/override)
  void initState() {
    super.initState();
    alert = DateTime.now().add(Duration(seconds: 10)); // 设置倒计时时间为10秒后
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Sample App'),
        ),
        body: TimedBuilder.scheduled([alert], builder: (context) {
          // 当倒计时时间到达时触发此函数
          var now = DateTime.now();
          var reached = now.compareTo(alert) >= 0;
          final textStyle = Theme.of(context).textTheme.headline6;
          return Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                Icon(
                  reached ? Icons.alarm_on : Icons.alarm,
                  color: reached ? Colors.red : Colors.green,
                  size: 48,
                ),
                !reached
                    ? TimedBuilder.periodic(Duration(seconds: 1), // 每秒更新剩余时间
                        alignment: Duration.zero, builder: (context) {
                        var now = DateTime.now();
                        var remaining = alert.difference(now); // 计算剩余时间
                        return Text(
                          formatDuration(remaining),
                          style: textStyle,
                        );
                      })
                    : Text("Alert", style: textStyle), // 倒计时结束后显示提醒
                ElevatedButton(
                  child: Text("Reset"), // 重置按钮
                  onPressed: () {
                    setState(() {
                      alert = DateTime.now().add(Duration(seconds: 10)); // 重置倒计时时间为10秒后
                    });
                  },
                ),
              ],
            ),
          );
        }),
      ),
      theme: ThemeData(backgroundColor: Colors.white),
    );
  }
}

String formatDuration(Duration d) {
  String f(int n) {
    return n.toString().padLeft(2, '0'); // 格式化分钟和秒为两位数
  }

  // 向上取整到最近的一秒
  d += Duration(microseconds: 999999);
  return "${f(d.inMinutes)}:${f(d.inSeconds % 60)}"; // 返回格式为 MM:SS
}

更多关于Flutter定时构建任务插件timed_builder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter定时构建任务插件timed_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


timed_builder 是一个 Flutter 插件,它允许你在指定的时间间隔内自动重建 widget。这对于需要在特定时间间隔内更新 UI 的场景非常有用,例如显示实时数据、倒计时、轮播图等。

安装 timed_builder 插件

首先,你需要在 pubspec.yaml 文件中添加 timed_builder 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  timed_builder: ^0.1.0 # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

使用 timed_builder 插件

timed_builder 提供了一个 TimedBuilder widget,你可以在你的应用中使用它来自动重建 widget。

基本用法

以下是一个简单的示例,展示了如何使用 TimedBuilder 每秒钟更新一次 UI:

import 'package:flutter/material.dart';
import 'package:timed_builder/timed_builder.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Timed Builder Example'),
        ),
        body: Center(
          child: TimedBuilder(
            duration: Duration(seconds: 1),
            builder: (context) {
              return Text(
                'Current Time: ${DateTime.now().toString()}',
                style: TextStyle(fontSize: 20),
              );
            },
          ),
        ),
      ),
    );
  }
}

参数说明

  • duration: 指定时间间隔,表示每隔多长时间重建一次 widget。
  • builder: 一个回调函数,返回需要重建的 widget。该函数会在每次时间间隔到达时被调用。
  • onTick (可选): 每次时间间隔到达时执行的回调函数。
  • alignment (可选): 控制 widget 的对齐方式。

高级用法

你可以结合 TimedBuilder 和其他 Flutter widget 来实现更复杂的功能。例如,你可以使用 TimedBuilder 来创建一个简单的倒计时器:

class CountdownTimer extends StatefulWidget {
  [@override](/user/override)
  _CountdownTimerState createState() => _CountdownTimerState();
}

class _CountdownTimerState extends State<CountdownTimer> {
  int _secondsRemaining = 60;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: TimedBuilder(
        duration: Duration(seconds: 1),
        builder: (context) {
          if (_secondsRemaining > 0) {
            _secondsRemaining--;
          }
          return Text(
            'Time Remaining: $_secondsRemaining seconds',
            style: TextStyle(fontSize: 20),
          );
        },
      ),
    );
  }
}
回到顶部