Исключение MissingPlugin Вызов собственного кода с помощью метода MethodChannel в Firebase.onBackGroundMessageAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Исключение MissingPlugin Вызов собственного кода с помощью метода MethodChannel в Firebase.onBackGroundMessage

Сообщение Anonymous »

Я пытаюсь вызвать собственный метод, когда в фоновом режиме приходит уведомление, но когда Flutter пытается выполнить вызов собственного метода, я получаю следующую ошибку:
Ошибка

Код: Выделить всё

I/flutter (20709): Executing background
E/flutter (20709): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: MissingPluginException(No implementation found for method triggerAlarm on channel com.channel/method)
E/flutter (20709): #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:332:7)
E/flutter (20709): 
E/flutter (20709): #1      AlarmService.triggerAlarm (package:alarm_example/main.dart:49:7)
E/flutter (20709): 
Это мои файлы Kotlin для настройки метода:
Application.kt

Код: Выделить всё

class MyApplication : Application() {

override fun onCreate() {
super.onCreate()
initializeFlutterEngine()
}

private fun initializeFlutterEngine() {
// Create a new FlutterEngine instance
val flutterEngine = FlutterEngine(this)

flutterEngine.dartExecutor.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
// Cache the engine for later use
FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine)
}
}
MainActivity.kt

Код: Выделить всё

class MainActivity: FlutterActivity() {

private val METHOD_CHANNEL = "com.channel/method"
private val engineId = "my_engine_id"

override fun onCreate(savedInstanceState: Bundle?) {
Log.d("MainActivity", "Creating main activity")
super.onCreate(savedInstanceState)
FlutterEngineCache.getInstance().put(engineId, flutterEngine)

// Initialize and cache the FlutterEngine
// Get the cached FlutterEngine
val cachedEngine = FlutterEngineCache.getInstance().get(engineId)
if (cachedEngine != null) {
Log.d("MainActivity", "Using cached FlutterEngine $cachedEngine")
configureFlutterEngine(cachedEngine)
} else {
Log.e("MainActivity", "Cached FlutterEngine not found")
}
}

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
flutterEngine.plugins.add(AlarmPlugin())
}
}

AlarmPlugin.kt

Код: Выделить всё

class AlarmPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {

private lateinit var context: Context
private var methodChannel: MethodChannel? = null

// Instance variable for FlutterPluginBinding
private var flutterPluginBinding: FlutterPlugin.FlutterPluginBinding? = null

override fun onAttachedToEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
flutterPluginBinding = binding

if(methodChannel == null){
Log.d("PLUGIN", "Initializing flutter plugin first time")
// Init Flutter Plugin First Time Only
initPlugin(binding.binaryMessenger)
}
}

private fun initPlugin(binaryMessenger: BinaryMessenger) {
methodChannel = MethodChannel(binaryMessenger, "com.channel/method")
methodChannel?.setMethodCallHandler(this)
}

override fun onAttachedToActivity(binding: ActivityPluginBinding) {
flutterPluginBinding?.binaryMessenger?.let {
Log.d("PLUGIN", "Reinitialize forcefully from MainIsolate")

// Reinitialize MethodChannel Forcefully from MainIsolate
initPlugin(it)
}
}

override fun onDetachedFromActivity() {
methodChannel = null
}

override fun onDetachedFromActivityForConfigChanges() {
// Handle configuration changes if needed
}

override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {}

override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
// Clean up resources when detached from engine
methodChannel = null
}

override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
when (call.method) {
"triggerAlarm" ->  {
Log.d("PLUGIN", "Calling Alarm")

result.success("triggerAlarm done")
}
else -> {
result.notImplemented()
}
}
}
}
И вызов со стороны флаттера, когда уведомление приходит в фоновом режиме
main.dart

Код: Выделить всё

...

Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print("Executing background");

static const MethodChannel _channel = MethodChannel('com.channel/method');

await _channel.invokeMethod('triggerAlarm');
}

Future main() async {
...

FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);

...

runApp(const App());
}

...

Я попробовал очистить флаттер и пересобрать APK, а также убедиться, что имена методов и каналов совпадают.
Метод работает при вызове с открытым приложением, но не работает в фоновом режиме. Сейчас я просто записываю что-то, когда метод срабатывает.
Flutter Doctor:

Код: Выделить всё

Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel master, 3.23.0-13.0.pre.189, on Microsoft Windows [Versi¢n 10.0.22631.4317], locale es-ES)
[√] Windows Version (Installed version of Windows is version 10 or higher)
[√] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[√] Chrome - develop for the web
[√] Visual Studio - develop Windows apps (Visual Studio Build Tools 2022 17.7.2)
[√] Android Studio (version 2022.2)
[√] VS Code (version 1.94.2)
[√] Connected device (4 available)
[√] Network resources

• No issues found!
Вопрос:
Как я могу убедиться, что мой собственный метод настроен в канале, когда уведомление поступает в фон?
Я пытался следовать этой средней статье, но это не сработало должным образом:
https://medium.com/@kkgowtham/workaroun ... od-channel -обработчик-разрыва-связи-при-фоновом-сообщении

Подробнее здесь: https://stackoverflow.com/questions/791 ... base-onbac
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»