首先感谢您好的迅速修复和反馈!!!🙏
我有一个小疑问:
使用1.2.2版本,在这个之前我需要手动去修改我工程的build文件
// ── native_workmanager 1.2.1:修复 applyMiddleware StackOverflow ──
// Enqueue.kt 使用 NativeWorkmanagerPlugin.applyMiddleware(...) 会绑定到
// NativeWorkmanagerPlugin+Middleware.kt 里 Companion 扩展;其函数体写成
// applyMiddleware(...) 时 Kotlin 会再次解析为同一扩展,导致无限递归。
// 与同包 CommandProcessor / ChainHelper 一致,改为调用顶层 internal applyMiddleware。
tasks.register('patchNativeWorkmanagerEnqueueApplyMiddleware') {
group = 'build'
description = 'Patches native_workmanager Enqueue.kt to avoid applyMiddleware StackOverflow (v1.2.1).'
doLast {
def flutterProjectDir = rootProject.projectDir.parentFile
def depsFile = new File(flutterProjectDir, '.flutter-plugins-dependencies')
if (!depsFile.exists()) {
logger.warn('patchNativeWorkmanager: .flutter-plugins-dependencies missing, skip.')
return
}
def parsed = new groovy.json.JsonSlurper().parse(depsFile)
String pluginPath = null
parsed.plugins?.android?.each { p ->
if (p.name == 'native_workmanager') {
pluginPath = p.path as String
}
}
if (pluginPath == null) {
logger.warn('patchNativeWorkmanager: native_workmanager not in plugin list, skip.')
return
}
def enqueueKt = new File(
pluginPath,
'android/src/main/kotlin/dev/brewkits/native_workmanager/NativeWorkmanagerPlugin+Enqueue.kt')
if (!enqueueKt.exists()) {
logger.warn("patchNativeWorkmanager: not found: ${enqueueKt}")
return
}
def text = enqueueKt.getText('UTF-8')
def buggy = 'NativeWorkmanagerPlugin.applyMiddleware(context, workerClassName, inputJson)'
def fixed = 'applyMiddleware(context, workerClassName, inputJson)'
if (text.contains(buggy)) {
enqueueKt.write(text.replace(buggy, fixed), 'UTF-8')
logger.lifecycle('patchNativeWorkmanager: updated NativeWorkmanagerPlugin+Enqueue.kt')
} else if (text.contains(fixed)) {
logger.lifecycle('patchNativeWorkmanager: Enqueue.kt already OK')
} else {
logger.warn('patchNativeWorkmanager: expected call not found (plugin version changed?)')
}
}
}
// DartWorker 头less 引擎默认不注册任何 Flutter 插件;仅为调试任务注册
// flutter_local_notifications,使 Dart 侧 plugin.show 可用(不启用全量 GeneratedPluginRegistrant,避免 BLE 等副作用)。
tasks.register('patchNativeWorkmanagerFlutterEngineLocalNotifications') {
group = 'build'
description = 'Patches native_workmanager FlutterEngineManager + build.gradle for FLN on worker engine.'
doLast {
def flutterProjectDir = rootProject.projectDir.parentFile
def depsFile = new File(flutterProjectDir, '.flutter-plugins-dependencies')
if (!depsFile.exists()) {
logger.warn('patchNativeWorkmanagerFLN: .flutter-plugins-dependencies missing, skip.')
return
}
def parsed = new groovy.json.JsonSlurper().parse(depsFile)
String pluginPath = null
parsed.plugins?.android?.each { p ->
if (p.name == 'native_workmanager') {
pluginPath = p.path as String
}
}
if (pluginPath == null) {
logger.warn('patchNativeWorkmanagerFLN: native_workmanager not found, skip.')
return
}
def nwGradle = new File(pluginPath, 'android/build.gradle')
if (nwGradle.exists() && !nwGradle.text.contains('UREVO_FLN_WORKER_ENGINE_DEPS')) {
nwGradle.append('''
// UREVO_FLN_WORKER_ENGINE_DEPS (app/build.gradle 补丁): DartWorker 引擎注册 FLN 所需
dependencies {
implementation project(':flutter_local_notifications')
}
''')
logger.lifecycle('patchNativeWorkmanagerFLN: appended FLN dependency to native_workmanager/android/build.gradle')
}
def engineKt = new File(
pluginPath,
'android/src/main/kotlin/dev/brewkits/native_workmanager/engine/FlutterEngineManager.kt')
if (!engineKt.exists()) {
logger.warn("patchNativeWorkmanagerFLN: not found: ${engineKt}")
return
}
def kt = engineKt.getText('UTF-8')
if (kt.contains('UREVO: FlutterLocalNotificationsPlugin registered on worker engine')) {
logger.lifecycle('patchNativeWorkmanagerFLN: FlutterEngineManager.kt already patched')
return
}
def anchor = ''' )
// Destroy the engine on any init failure so we don't leak'''
if (!kt.contains(anchor)) {
logger.warn('patchNativeWorkmanagerFLN: FlutterEngineManager anchor not found (plugin version changed?)')
return
}
def insert = ''' )
// UREVO: 仅注册 flutter_local_notifications,供 DartWorker 内本地通知(避免全量插件注册)。
try {
flutterEngine.getPlugins().add(
com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin()
)
NativeLogger.d("UREVO: FlutterLocalNotificationsPlugin registered on worker engine")
} catch (e: Exception) {
NativeLogger.e("UREVO: FlutterLocalNotificationsPlugin register failed", e)
}
// Destroy the engine on any init failure so we don't leak'''
engineKt.write(kt.replace(anchor, insert), 'UTF-8')
logger.lifecycle('patchNativeWorkmanagerFLN: patched FlutterEngineManager.kt')
}
}
afterEvaluate {
tasks.named('preBuild').configure {
dependsOn(
'patchNativeWorkmanagerEnqueueApplyMiddleware',
'patchNativeWorkmanagerFlutterEngineLocalNotifications',
)
}
}
才能解决之前反馈的这两个问题
#17
#18
=============================================
我刚更新了最新版本1.2.2之后,去掉这段代码,
首先https://github.com/brewkits/native_workmanager/issues/17这个问题得到了解决
其次https://github.com/brewkits/native_workmanager/issues/18我没有按照去自注册插件

我的后台任务中的通知和读取Google health的数据也能正常触发。
而且我在触发后台任务时,我前台通过蓝牙连接设备也没有触发断开了。
这个是我收到的奇怪的表现,但是我很喜欢这个表现。只是有点不明白你们做了什么调整。
1、首先第一蓝牙不断开,是因为我默认设置的是registerPlugins: false。
2、但是我没有自注册flutter的通知组件,按你所说,理论是不会触发,结果我得到的是会触发通知,我也没注册Google health的插件,它也能正常去读取到数据。这是表现让我很意外,但是是我想要的结果。
以下是我的核心代码:
/// 在 `main` 里于 [WidgetsFlutterBinding.ensureInitialized] 之后调用一次即可。
///
/// **Android**:使用 [DartWorker] 且需在进程被杀后仍能执行时,宿主还需完成
/// [native_workmanager Android 配置](https://github.com/brewkits/native_workmanager/blob/main/doc/ANDROID_SETUP.md)
///(自定义 `Application` + `Configuration.Provider`、移除默认 WorkManager 初始化等)。
/// 主工程 `urevo_flutter` 已接入 `UrevoApplication` 与清单项。
Future initializeDebugPageNativeWorkmanager() {
return NativeWorkManager.initialize(
dartWorkers: {
kDebugPageNativeWorkmanagerCallbackId:
debugPageNativeWorkmanagerNotifyTask,
},
);
}
==========================
import android.app.Application
import android.content.Context
import androidx.work.Configuration
import androidx.work.DelegatingWorkerFactory
import dev.brewkits.kmpworkmanager.background.data.KmpWorkerFactory
import dev.brewkits.native_workmanager.SimpleAndroidWorkerFactory
import dev.brewkits.native_workmanager.engine.FlutterEngineManager
/**
-
为 native_workmanager 的 DartWorker
-
提供进程被杀死后 WorkManager 拉起时的 [Configuration.Provider] 与 callback handle 恢复。
-
参见官方文档:
-
ANDROID_SETUP.md — Killed-App Support for Dart Workers
*/
class UrevoApplication : Application(), Configuration.Provider {
override fun onCreate() {
super.onCreate()
val handle = getSharedPreferences(
"dev.brewkits.native_workmanager",
Context.MODE_PRIVATE,
).getLong("callback_handle", -1L)
if (handle != -1L) {
FlutterEngineManager.setCallbackHandle(handle)
}
}
override val workManagerConfiguration: Configuration
get() {
val factory = DelegatingWorkerFactory().apply {
addFactory(KmpWorkerFactory(SimpleAndroidWorkerFactory(this@UrevoApplication)))
}
return Configuration.Builder()
.setWorkerFactory(factory)
.build()
}
}
==========================================
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import com.polidea.rxandroidble2.exceptions.BleException;
import com.ryanheise.audioservice.AudioServiceActivity;
import com.ryanheise.audioservice.AudioServiceFragmentActivity;
import io.flutter.embedding.android.FlutterFragmentActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import io.reactivex.exceptions.UndeliverableException;
import io.reactivex.plugins.RxJavaPlugins;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import io.flutter.embedding.android.FlutterActivity;
import android.net.Uri;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
import io.reactivex.plugins.RxJavaPlugins;
public class MainActivity extends AudioServiceFragmentActivity {
private static final String BLUETOOTH_SERVICE_CHANNEL = "com.xxx.app/bluetooth_service";
private MethodChannel methodChannel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RxJavaPlugins.setErrorHandler(throwable -> {
if (throwable instanceof UndeliverableException && throwable.getCause() instanceof BleException) {
Log.v("SampleApplication", "Suppressed UndeliverableException: " + throwable);
return; // ignore BleExceptions as they were surely delivered at least once
}
// add other custom handlers if needed
throw new RuntimeException("Unexpected Throwable in RxJavaPlugins error handler", throwable);
});
}
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
// 创建MethodChannel用于Flutter与原生通信
methodChannel = new MethodChannel(
flutterEngine.getDartExecutor().getBinaryMessenger(),
BLUETOOTH_SERVICE_CHANNEL
);
methodChannel.setMethodCallHandler((call, result) -> {
switch (call.method) {
case "startForegroundService":
// 从Flutter获取自定义通知文本
String notificationText = call.argument("notificationText");
BluetoothForegroundService.startService(this, notificationText);
result.success(true);
break;
case "stopForegroundService":
BluetoothForegroundService.stopService(this);
result.success(true);
break;
default:
result.notImplemented();
break;
}
});
}
}
========================
至于android/app/build.gradle文件,最上面添加的代码,我也删除了,就是为了测1.2.2是否修复了,结果得出上面的表现
期待你的反馈!!!谢谢🙏🙏
首先感谢您好的迅速修复和反馈!!!🙏
我有一个小疑问:
使用1.2.2版本,在这个之前我需要手动去修改我工程的build文件
// ── native_workmanager 1.2.1:修复 applyMiddleware StackOverflow ──
// Enqueue.kt 使用
NativeWorkmanagerPlugin.applyMiddleware(...)会绑定到// NativeWorkmanagerPlugin+Middleware.kt 里 Companion 扩展;其函数体写成
//
applyMiddleware(...)时 Kotlin 会再次解析为同一扩展,导致无限递归。// 与同包 CommandProcessor / ChainHelper 一致,改为调用顶层 internal applyMiddleware。
tasks.register('patchNativeWorkmanagerEnqueueApplyMiddleware') {
group = 'build'
description = 'Patches native_workmanager Enqueue.kt to avoid applyMiddleware StackOverflow (v1.2.1).'
doLast {
def flutterProjectDir = rootProject.projectDir.parentFile
def depsFile = new File(flutterProjectDir, '.flutter-plugins-dependencies')
if (!depsFile.exists()) {
logger.warn('patchNativeWorkmanager: .flutter-plugins-dependencies missing, skip.')
return
}
def parsed = new groovy.json.JsonSlurper().parse(depsFile)
String pluginPath = null
parsed.plugins?.android?.each { p ->
if (p.name == 'native_workmanager') {
pluginPath = p.path as String
}
}
if (pluginPath == null) {
logger.warn('patchNativeWorkmanager: native_workmanager not in plugin list, skip.')
return
}
def enqueueKt = new File(
pluginPath,
'android/src/main/kotlin/dev/brewkits/native_workmanager/NativeWorkmanagerPlugin+Enqueue.kt')
if (!enqueueKt.exists()) {
logger.warn("patchNativeWorkmanager: not found: ${enqueueKt}")
return
}
def text = enqueueKt.getText('UTF-8')
def buggy = 'NativeWorkmanagerPlugin.applyMiddleware(context, workerClassName, inputJson)'
def fixed = 'applyMiddleware(context, workerClassName, inputJson)'
if (text.contains(buggy)) {
enqueueKt.write(text.replace(buggy, fixed), 'UTF-8')
logger.lifecycle('patchNativeWorkmanager: updated NativeWorkmanagerPlugin+Enqueue.kt')
} else if (text.contains(fixed)) {
logger.lifecycle('patchNativeWorkmanager: Enqueue.kt already OK')
} else {
logger.warn('patchNativeWorkmanager: expected call not found (plugin version changed?)')
}
}
}
// DartWorker 头less 引擎默认不注册任何 Flutter 插件;仅为调试任务注册
// flutter_local_notifications,使 Dart 侧 plugin.show 可用(不启用全量 GeneratedPluginRegistrant,避免 BLE 等副作用)。
tasks.register('patchNativeWorkmanagerFlutterEngineLocalNotifications') {
group = 'build'
description = 'Patches native_workmanager FlutterEngineManager + build.gradle for FLN on worker engine.'
doLast {
def flutterProjectDir = rootProject.projectDir.parentFile
def depsFile = new File(flutterProjectDir, '.flutter-plugins-dependencies')
if (!depsFile.exists()) {
logger.warn('patchNativeWorkmanagerFLN: .flutter-plugins-dependencies missing, skip.')
return
}
def parsed = new groovy.json.JsonSlurper().parse(depsFile)
String pluginPath = null
parsed.plugins?.android?.each { p ->
if (p.name == 'native_workmanager') {
pluginPath = p.path as String
}
}
if (pluginPath == null) {
logger.warn('patchNativeWorkmanagerFLN: native_workmanager not found, skip.')
return
}
// UREVO_FLN_WORKER_ENGINE_DEPS (app/build.gradle 补丁): DartWorker 引擎注册 FLN 所需
dependencies {
implementation project(':flutter_local_notifications')
}
''')
logger.lifecycle('patchNativeWorkmanagerFLN: appended FLN dependency to native_workmanager/android/build.gradle')
}
}
afterEvaluate {
tasks.named('preBuild').configure {
dependsOn(
'patchNativeWorkmanagerEnqueueApplyMiddleware',
'patchNativeWorkmanagerFlutterEngineLocalNotifications',
)
}
}
才能解决之前反馈的这两个问题
#17
#18
=============================================
我刚更新了最新版本1.2.2之后,去掉这段代码,
首先https://github.com/brewkits/native_workmanager/issues/17这个问题得到了解决
其次https://github.com/brewkits/native_workmanager/issues/18我没有按照去自注册插件
==========================
import android.app.Application
import android.content.Context
import androidx.work.Configuration
import androidx.work.DelegatingWorkerFactory
import dev.brewkits.kmpworkmanager.background.data.KmpWorkerFactory
import dev.brewkits.native_workmanager.SimpleAndroidWorkerFactory
import dev.brewkits.native_workmanager.engine.FlutterEngineManager
/**
为 native_workmanager 的 DartWorker
提供进程被杀死后 WorkManager 拉起时的 [Configuration.Provider] 与 callback handle 恢复。
参见官方文档:
ANDROID_SETUP.md — Killed-App Support for Dart Workers
*/
class UrevoApplication : Application(), Configuration.Provider {
override fun onCreate() {
super.onCreate()
}
override val workManagerConfiguration: Configuration
get() {
val factory = DelegatingWorkerFactory().apply {
addFactory(KmpWorkerFactory(SimpleAndroidWorkerFactory(this@UrevoApplication)))
}
return Configuration.Builder()
.setWorkerFactory(factory)
.build()
}
}
==========================================
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import com.polidea.rxandroidble2.exceptions.BleException;
import com.ryanheise.audioservice.AudioServiceActivity;
import com.ryanheise.audioservice.AudioServiceFragmentActivity;
import io.flutter.embedding.android.FlutterFragmentActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import io.reactivex.exceptions.UndeliverableException;
import io.reactivex.plugins.RxJavaPlugins;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import io.flutter.embedding.android.FlutterActivity;
import android.net.Uri;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
import io.reactivex.plugins.RxJavaPlugins;
public class MainActivity extends AudioServiceFragmentActivity {
private static final String BLUETOOTH_SERVICE_CHANNEL = "com.xxx.app/bluetooth_service";
private MethodChannel methodChannel;
}
========================
至于android/app/build.gradle文件,最上面添加的代码,我也删除了,就是为了测1.2.2是否修复了,结果得出上面的表现
期待你的反馈!!!谢谢🙏🙏