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
实例存储一个单一值,并可以被任何小部件单独观察。
在小部件中观察可观察值
步骤:
- 创建一个继承自
ObserverState
的小部件。 - 在
ObserverState
中使用observe
方法注册对特定ObservableValue
的兴趣。 - 当
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
会自动重新构建并显示最新的值。
使用总结
- 定义可观察值:为每个需要独立观察的状态变量使用
ObservableValue
。 - 在小部件中观察:继承
ObserverState
并使用observe
方法来开始观察特定的ObservableValue
。 - 自动重绘:观察到的小部件会在
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
更多关于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
,并实现 onStartJob
和 onStopJob
方法。
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'),
),
),
);
}
}