Flutter后台任务管理插件jobservable的使用

Flutter后台任务管理插件jObservable的使用

jObservable简介

jObservable 是一个受SwiftUI启发的轻量级且高效的Flutter包,用于处理基于可观察值的状态更新并触发UI重绘。此框架使用观察者模式,允许小部件观察单个状态变量(信号),并在所观察的状态发生变化时仅重绘受影响的小部件。

特性

  • 可观察值:创建可独立观察的状态变量 (ObservableValue)。
  • 高效UI重绘:小部件仅观察特定值,因此只有依赖这些值的小部件在更改时会重绘,减少了不必要的UI更新。
  • 异步处理:自动批量处理短时间内多次的 setState 调用,避免冗余重绘。
  • 简单API:无需复杂配置即可轻松管理和观察状态更新。

安装

在您的 pubspec.yaml 文件中添加 jObservable

dependencies:
  jobservable: ^0.0.1

然后运行以下命令以获取依赖项:

flutter pub get

快速开始

要开始使用 jObservable,首先导入该包:

import 'package:jobservable/observable.dart';

创建一个可观察的状态变量

定义一个包含多个可观察信号的 SignalManager

class SignalManager {
  final ObservableValue<double> signalA = ObservableValue(0.0); // 初始化为0.0
  final ObservableValue<double> signalB = ObservableValue(0.0);
  final ObservableValue<double> signalC = ObservableValue(0.0);

  // 可以添加更多信号
}

final SignalManager globalSignalManager = SignalManager();

每个 ObservableValue 实例存储一个单一值,并可以被任何小部件单独观察。


在小部件中观察可观察值

步骤:

  1. 创建一个继承自 ObserverState 的小部件。
  2. ObserverState 中使用 observe 方法注册对特定 ObservableValue 的兴趣。
  3. ObservableValue 发生变化时,小部件会自动重建。

示例代码:

import 'package:flutter/material.dart';
import 'package:jobservable/observable.dart';

// 自定义小部件
class SignalWidget extends StatefulWidget {
  [@override](/user/override)
  _SignalWidgetState createState() => _SignalWidgetState();
}

class _SignalWidgetState extends ObserverState<SignalWidget> {
  late final ObservableWrapper signalWrapper;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 注册对 signalA 的观察
    signalWrapper = observe(globalSignalManager.signalA);
  }

  // 增加信号值的方法
  void incrementSignal() {
    globalSignalManager.signalA.value += 1.0; // 更新信号值,触发重绘
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('Signal A: ${globalSignalManager.signalA.value}'), // 显示信号值
        ElevatedButton(
          onPressed: incrementSignal, // 点击按钮增加信号值
          child: Text('Increment Signal A'),
        ),
      ],
    );
  }
}

示例说明:

  • SignalWidget 观察了 globalSignalManager.signalA
  • signalA 改变时,SignalWidget 会自动重新构建并显示最新的值。

使用总结

  1. 定义可观察值:为每个需要独立观察的状态变量使用 ObservableValue
  2. 在小部件中观察:继承 ObserverState 并使用 observe 方法来开始观察特定的 ObservableValue
  3. 自动重绘:观察到的小部件会在 ObservableValue 改变时自动更新。

API 参考

以下是 jObservable 的主要类及其功能:

  • ObservableObject:支持添加和通知观察者的基类。
  • ObservableValue:包装单一值并通知观察者其变化。
  • ObservableWrapper:连接 ObservableObject 和小部件的 ObserverState,以便进行更新。
  • ObserverState:管理观察者并自动释放它们的 State 子类。

示例代码完整Demo

以下是一个完整的示例代码,展示如何使用 jObservable 来管理后台任务和UI更新:

import 'package:flutter/material.dart';
import 'package:jobservable/observable.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SignalManagerPage(),
    );
  }
}

class SignalManagerPage extends StatelessWidget {
  final SignalManager signalManager = SignalManager();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('jObservable Demo')),
      body: Center(
        child: SignalWidget(signalManager: signalManager),
      ),
    );
  }
}

class SignalManager {
  final ObservableValue<double> signalA = ObservableValue(0.0);
  final ObservableValue<double> signalB = ObservableValue(0.0);
}

class SignalWidget extends StatefulWidget {
  final SignalManager signalManager;

  SignalWidget({required this.signalManager});

  [@override](/user/override)
  _SignalWidgetState createState() => _SignalWidgetState();
}

class _SignalWidgetState extends ObserverState<SignalWidget> {
  late final ObservableWrapper signalWrapperA;
  late final ObservableWrapper signalWrapperB;

  [@override](/user/override)
  void initState() {
    super.initState();
    // 观察 signalA 和 signalB
    signalWrapperA = observe(widget.signalManager.signalA);
    signalWrapperB = observe(widget.signalManager.signalB);
  }

  void incrementSignalA() {
    widget.signalManager.signalA.value += 1.0;
  }

  void incrementSignalB() {
    widget.signalManager.signalB.value += 1.0;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            Column(
              children: [
                Text('Signal A: ${widget.signalManager.signalA.value}'),
                ElevatedButton(
                  onPressed: incrementSignalA,
                  child: Text('Increment A'),
                ),
              ],
            ),
            Column(
              children: [
                Text('Signal B: ${widget.signalManager.signalB.value}'),
                ElevatedButton(
                  onPressed: incrementSignalB,
                  child: Text('Increment B'),
                ),
              ],
            ),
          ],
        ),
      ],
    );
  }
}

更多关于Flutter后台任务管理插件jobservable的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


JobService 是 Flutter 中用于管理后台任务的一个插件,它允许你在应用程序的后台执行长时间运行的任务,即使应用程序被关闭或处于后台状态。JobService 是基于 Android 的 JobScheduler API 和 iOS 的 Background Fetch API 实现的。

安装 jobservices 插件

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

dependencies:
  flutter:
    sdk: flutter
  jobservices: ^0.0.1  # 请使用最新版本

然后运行 flutter pub get 来安装插件。

使用 JobService

1. 创建后台任务

首先,你需要创建一个后台任务类,继承自 JobService,并实现 onStartJobonStopJob 方法。

import 'package:jobservices/jobservices.dart';

class MyBackgroundTask extends JobService {
  [@override](/user/override)
  Future<void> onStartJob(JobParameters params) async {
    // 在这里执行你的后台任务
    print("Background task started");

    // 模拟一个长时间运行的任务
    await Future.delayed(Duration(seconds: 10));

    print("Background task completed");

    // 任务完成后调用 jobFinished
    jobFinished(params, false);
  }

  [@override](/user/override)
  Future<void> onStopJob(JobParameters params) async {
    // 如果任务被停止,可以在这里进行清理工作
    print("Background task stopped");
  }
}

2. 注册后台任务

main.dart 中注册你的后台任务:

import 'package:flutter/material.dart';
import 'package:jobservices/jobservices.dart';
import 'my_background_task.dart'; // 导入你的后台任务类

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

  // 注册后台任务
  JobService.registerJobService(MyBackgroundTask());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter JobService Demo'),
      ),
      body: Center(
        child: Text('Press home button to send app to background'),
      ),
    );
  }
}

3. 调度后台任务

你可以在需要的时候调度后台任务。例如,在用户点击按钮时调度任务:

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter JobService Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 调度后台任务
            JobService.scheduleJob(
              jobId: 1,
              service: MyBackgroundTask(),
              constraints: JobConstraints(
                networkType: NetworkType.any,
                requiresCharging: false,
                requiresDeviceIdle: false,
              ),
              period: Duration(minutes: 15),
              isPersisted: true,
            );
          },
          child: Text('Schedule Background Task'),
        ),
      ),
    );
  }
}
回到顶部