Flutter样式定时任务插件style_cron_job的使用

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

Flutter样式定时任务插件style_cron_job的使用

标题

Flutter样式定时任务插件style_cron_job的使用

内容

Style Cron Job 是一个用于执行和定义周期性操作的插件,具有基本语法。你可以定义周期,并通过自己的执行器或控制器来运行你的过程。

  • 功能

    • 对于第二、分钟、小时、天、周和月时间点,你可以指定诸如“每 x 在 y 时间”或“每隔 x,在 y 时间”这样的周期。
    • 它有一个简单的语法,接近口语化。
    • 例如:
      each.day.atHour(10).atMinute(20);
      every.x(1).day.atHour(10).atMinute(20);
      
      这两个都表示“每天 1:20:00”。
  • 工作原理

    • 它基本上使用了每秒检查一次的机制(Stream.periodic)。如果有必要,就会开始执行过程。每次检查都是一个小过程,结束时大约需要 ~0.0012 ms (60k 检查在 77ms)。
    • 为了减少内存消耗,它需要每秒检查一次,而不是使用 Future.delayed 或 Timer 直到下一个时间,这是其他方法。
  • 附加条件

    • 可以定义附加条件,如:
      each.day.atHour(10).atMinute(20).only((time) {  
        return time.weekday != 7; // 除了星期日
      });
      

开始使用

1)定义周期

有 2 种不同的选项来开始定义周期:eachevery

  • each 用于每月、每周、每天、每小时、每分钟和每秒。
  • every 用于每 3 天一次、每 2 个月一次等需求。
each.**
every.x(3).**
  • ** 必须是 monthweekdayhourminutesecond,对于两者来说。
在子时间段中指定运行时间

例如“每天 1:20:30”

each.day.atHour(10).atMinute(20).atSecond(30);

默认的 hourminutesecond0。 默认的 weekdayday1

  • at* 子时间段可以按顺序使用。
生成子时间段

你可以使用特定时间的子时间段。

each.day.fromNowOn(DateTime.now());
each.day.fromNowOn(); // 默认 DateTime.now()
2)启动
  • 监听
    var period = each.day.onMinute(10);
    period.listen((t) {
      // 每天 00:10
    });
    period.dispose();
    
  • Stream
    var stream = each.minute.fromNowOn().asStream();
    // eg startinging 00:10:38
    stream.listen((time){
      // 每分钟 38.秒
    });
    // 不要忘记
    stream.cancel();
    
  • Controller 控制器管理所有操作与单个流。因此这是最有效的使用方式。
    var runner = CronJobController();
    runner.add(each.second.asRunner((time) {  
      // 每秒
    }));
    runner.add(every.x(1).second.asRunner((time) {  
      // 每 1 秒
    }));
    
    // 启动
    runner.start();
    
  • 自定义 你可以通过时间检查周期是否需要调用。
    var period = each.second.period;
    var necessary = period.isNecessary(DateTime.now());
    if (necessary {
      // 做
    }
    

使用示例

  • 每周六晚上 11:45(11:45 PM)
    each.week.onWeekDay(6).atHour(22).atMinute(45);
    
  • 每周一早上 9:00
    each.week.onWeekDay(1).atHour(9);
    
  • 每月 15 日早上 9:00
    each.month.onDay(15).atHour(9);
    
  • 每隔 3 天 00:00:59
    every.x(3).day.atSecond(59);
    

示例代码

/*
 * Copyright 2styledart.dev - Mehmet Yaz
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

import 'package:style_cron_job/style_cron_job.dart';

void main() {
  every.x(10).second.listen((time) {
    print(time);
    // 2:24:13.101423
    //  e:2:24:23.101423
    //  e:2:24:33.101420
  });
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用style_cron_job插件来设置样式定时任务的示例代码。请注意,由于style_cron_job可能不是一个真实存在的Flutter插件(由于命名较为特殊,我假设它是一个自定义或假设的插件),这里我将提供一个类似的实现概念,并基于Flutter的定时任务插件(例如flutter_local_notificationsworkmanager)来展示如何设置一个定时任务。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_local_notifications: ^9.0.0  # 用于本地通知
  workmanager: ^0.7.0  # 用于后台任务调度

2. 配置Android和iOS

对于Android,需要在android/app/src/main/AndroidManifest.xml中添加必要的权限和服务声明:

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

<service
    android:name=".MyWorker"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="false">
    <intent-filter>
        <action android:name="com.example.myapp.MY_WORKER"/>
    </intent-filter>
</service>

对于iOS,需要在ios/Runner/Info.plist中添加必要的权限配置,并在AppDelegate.swift中设置后台模式:

// Info.plist
<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>
// AppDelegate.swift
import UIKit
import Flutter
import UserNotifications

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            if let error = error {
                print("Notification authorization failed: \(error.localizedDescription)")
            }
        }
        application.registerForRemoteNotifications()

        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

3. 编写Worker类(Android)

在Android中,你需要创建一个Worker类来处理后台任务:

// android/app/src/main/java/com/example/myapp/MyWorker.java
package com.example.myapp;

import androidx.work.Worker;
import androidx.work.WorkerParameters;

public class MyWorker extends Worker {

    public MyWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        // 在这里执行你的任务,例如发送通知
        FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin.getInstance();
        if (flutterLocalNotificationsPlugin != null) {
            flutterLocalNotificationsPlugin.show(
                0,
                "Hello",
                "This is a scheduled notification!",
                NotificationDetails(
                    NotificationChannels.CHANNEL_ID,
                    NotificationChannels.CHANNEL_DESCRIPTION,
                    icon: 'ic_launcher'
                )
            );
        }
        return Result.success();
    }
}

4. Flutter代码设置定时任务

在Flutter中,使用Workmanager来调度后台任务:

import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:workmanager/workmanager.dart';

void callbackDispatcher() {
  Workmanager.executeTask((task, inputData) async {
    // 在这里处理任务
    FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
        FlutterLocalNotificationsPlugin();

    var androidChannel = AndroidNotificationChannel(
      'channel_id',
      'Channel human readable title',
      'Channel description',
      importance: Importance.Max,
    );
    await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<
        AndroidFlutterLocalNotificationsPlugin>()
        ?.createNotificationChannel(androidChannel);

    await flutterLocalNotificationsPlugin.show(
      0,
      'Hello',
      'This is a scheduled notification!',
      NotificationDetails(
        android: AndroidNotificationDetails(
          'channel_id',
          'Channel human readable title',
          'Channel description',
          icon: 'ic_launcher',
        ),
      ),
    );
    return Future.value(true);
  });
}

void main() {
  Workmanager.initialize(
    callbackDispatcher,
    isInDebugMode: () => true // 如果你要在调试模式下运行,设置为true
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Scheduled Notification'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 设置定时任务
              Workmanager.registerOneOffTask(
                'my_unique_task_identifier',
                'com.example.myapp.MY_WORKER', // 与AndroidManifest.xml中的action匹配
                initialDelay: Duration(seconds: 10), // 延迟10秒执行
              );
            },
            child: Text('Schedule Notification'),
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter中结合flutter_local_notificationsworkmanager插件来设置一个简单的定时任务,并在任务完成时显示一个本地通知。如果你有一个特定的style_cron_job插件,请查阅其官方文档以获取更具体的实现方法。

回到顶部