Ошибка
Код: Выделить всё
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):
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)
}
}
Код: Выделить всё
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())
}
}
Код: Выделить всё
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());
}
...
Метод работает при вызове с открытым приложением, но не работает в фоновом режиме. Сейчас я просто записываю что-то, когда метод срабатывает.
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