Как вызвать MethodChannel из изолята, созданного android_alarm_manager?

Я пытался запланировать фоновое обслуживание. Для этого я использовал https://pub.dev/packages/android_alarm_manager. Это работает хорошо.

В моем примере я попытался получить из своего изолята (обратный вызов android_alarm_manager) уровень заряда батареи, следуя руководству по флаттеру: https://flutter.dev/docs/development/platform-integration/platform-channels?tab=android-channel-java-tab.

Если я вызываю свой обратный вызов вручную, он работает (так что я хорошо выполняю часть Android). Если android_alarm_manager вызовет его, у меня появится следующая ошибка:

Unhandled Exception: MissingPluginException(No implementation found for method getBatteryLevel on channel net.example.com/battery)

Это странно, потому что из другого изолята, где я использовал https://pub.dev/packages/flutter_downloader для загрузки файла этот плагин использовал MethodChannel ...

Вот мой код для android_alarm_manager:

import 'package:flutter/services.dart';

class AndroidManagerCallBack {
  static Future<void> main() async {
    _AndroidManagerCallBack test = _AndroidManagerCallBack();
    await test.getBatteryLevel();
  }
}

class _AndroidManagerCallBack {
  static const platform = const MethodChannel('net.example.com/battery');

  Future<void> getBatteryLevel() async {
    String batteryLevel;
    try {
      final int result = await platform.invokeMethod('getBatteryLevel');
      batteryLevel = 'Battery level at $result % .';
    } on PlatformException catch (e) {
      batteryLevel = "Failed to get battery level: '${e.message}'.";
    }
    print(batteryLevel);
  }
}

Я просто вызываю обратный вызов, например:

AndroidAlarmManager.periodic(
      Duration(seconds: 20),
      0,
      AndroidManagerCallBack.main(),
      rescheduleOnReboot: true,
      wakeup: false,
    );

В обратном вызове android_alarm_manager я могу вызывать плагины, которые использовали какой-то MethodChannel, но когда я попробовал с моим MethodChannel, у меня возникли ошибки ...

Кто-нибудь может направить меня :)?


person Eng    schedule 22.06.2020    source источник


Ответы (1)


Кажется невозможным напрямую вызвать MethodChannel через изолятор.

Но, создав плагин, я могу добиться того, чего хочу. Итак, решение - создать плагин :)!

person Eng    schedule 23.06.2020
comment
Удалось ли вам это решить? Я хочу вызвать собственный код из изолята, но я не вижу, как это сделать, даже с помощью плагина - person pitazzo; 02.10.2020
comment
flutter.dev/docs/development/packages-and-plugins/ Я следил за документом, чтобы создать плагин :) - person Eng; 02.10.2020