Skip to content

咨询关于1.2.2版本 #20

@zhujianguo

Description

@zhujianguo

首先感谢您好的迅速修复和反馈!!!🙏
我有一个小疑问:
使用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我没有按照去自注册插件

Image 我的后台任务中的通知和读取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_workmanagerDartWorker

  • 提供进程被杀死后 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是否修复了,结果得出上面的表现
期待你的反馈!!!谢谢🙏🙏

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions