Flutter定时任务插件cron的使用

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

Flutter定时任务插件cron的使用

Cron

Cron 是一个用于在Flutter中运行周期性任务的库,允许你在固定的时间或间隔执行任务。

pub package

Usage 示例用法

下面是一个简单的使用例子:

import 'package:cron/cron.dart';

void main() {
  final cron = Cron();

  // 每三分钟执行一次任务
  cron.schedule(Schedule.parse('*/3 * * * *'), () async {
    print('every three minutes');
  });

  // 在每小时的第8到11分钟之间执行任务
  cron.schedule(Schedule.parse('8-11 * * * *'), () async {
    print('between every 8 and 11 minutes');
  });
}

Cron解析器 Cron Parser

你可以轻松地创建和解析 cron格式 的时间表达式:

import 'package:cron/cron.dart';

void main() {
  // 解析cron表达式并获取对应的分钟列表
  print(Schedule.parse('3-5 * * * *').minutes); // 输出: [3, 4, 5]

  // 创建一个Schedule对象并转换为cron字符串
  print(Schedule(hours: 12, minutes: 25, weekdays: [2, 3])
      .toCronString()); // 输出: 25 12 * * 2,3
}

Links 相关链接

完整示例 Demo

接下来是包含错误处理的完整示例代码,演示了如何设置每六秒执行一次的任务,并且展示了如何正确关闭Cron实例:

import 'package:cron/cron.dart';

Future<void> main() async {
  final cron = Cron();

  try {
    // 每6秒执行一次任务
    cron.schedule(Schedule.parse('*/6 * * * * *'), () {
      print(DateTime.now());
    });

    // 等待20秒后关闭Cron实例
    await Future.delayed(Duration(seconds: 20));
    await cron.close();
  } on ScheduleParseException {
    // 如果cron解析失败,则抛出"ScheduleParseException"
    await cron.close();
  }
}

注意:此示例中的cron表达式 */6 * * * * * 包含了秒级调度,这与通常的五分钟级别调度有所不同。根据你的需求调整cron表达式以适应不同的调度频率。


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

1 回复

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


当然,关于在Flutter中使用cron插件来实现定时任务,我可以为你提供一个基本的代码示例。不过需要注意的是,Flutter本身并没有直接名为cron的官方插件,但你可以使用一些类似功能的插件来实现定时任务,比如flutter_workmanagerflutter_local_notifications结合其他逻辑来实现类似的效果。

然而,为了贴近你的要求,我将展示如何使用flutter_workmanager插件来设置一个定时任务。这个插件允许你在后台执行Dart代码,非常适合用于需要定期执行的任务。

首先,确保你已经在pubspec.yaml文件中添加了flutter_workmanager的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_workmanager: ^0.x.x  # 请检查最新版本号并替换

然后,运行flutter pub get来获取依赖。

接下来是具体的代码实现:

  1. 初始化Workmanager

在你的主应用程序入口(通常是main.dart)中初始化Workmanager:

import 'package:flutter/material.dart';
import 'package:flutter_workmanager/flutter_workmanager.dart';
import 'worker_task.dart';  // 假设你将任务逻辑放在这个文件里

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager.initialize(
    callbackDispatcher,  // 这是处理任务的回调函数
    isInDebugMode: true  // 如果是开发模式,设置为true,生产环境应设置为false
  );
  
  // 注册一个周期性任务
  Workmanager.registerPeriodicTask(
    "1",  // 任务唯一标识符
    "simplePeriodicTask",  // 任务标签,用于回调函数中识别
    frequency: Duration(minutes: 15),  // 每15分钟执行一次
    constraints: Constraints(
      networkType: NetworkType.CONNECTED,  // 仅在设备连接到网络时执行
    )
  );

  runApp(MyApp());
}

void callbackDispatcher() {
  Workmanager.executeTask((task, inputData) async {
    // 在这里执行你的任务逻辑
    // 例如调用worker_task.dart中的函数
    await executeTaskFunction();
    return Future.value(true);  // 任务成功完成
  });
}
  1. 定义任务逻辑

worker_task.dart文件中定义你的任务逻辑:

import 'package:flutter_workmanager/flutter_workmanager.dart';

Future<void> executeTaskFunction() async {
  // 这里放置你的任务逻辑,例如发送网络请求、更新本地数据等
  print("任务正在执行...");
  // 示例:发送一个本地通知
  FlutterLocalNotificationsPlugin().show(
    0,
    '任务通知',
    '定时任务已执行',
    NotificationDetails(
      android: AndroidNotificationDetails(
        'channel_id',
        'Channel Name',
        'Channel Description',
        importance: Importance.Max,
        priority: Priority.High
      )
    )
  );
}
  1. 配置Android和iOS

对于Android,你需要在AndroidManifest.xml中配置权限和服务:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <application
        ...>

        <service
            android:name=".BackgroundService"
            android:enabled="true"
            android:exported="false"
            android:permission="android.permission.BIND_JOB_SERVICE">
            <intent-filter>
                <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
            </intent-filter>
        </service>

        <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
        
        <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
        
    </application>
</manifest>

对于iOS,你需要在Info.plist中添加必要的权限,并在AppDelegate.swift中配置UNUserNotificationCenter。

这是一个基本的示例,展示了如何使用flutter_workmanager来设置一个定时任务。根据你的具体需求,你可能需要调整任务逻辑、频率和约束条件。

回到顶部