Как использовать канал метода Flutter в фоновом режиме (приложение свернуто / закрыто)

Я работаю над собственным виджетом Android в приложении Flutter. В котором есть кнопка обновления, при нажатии на нее я должен вызвать метод в коде Flutter. Я использую канал Flutter Method для связи, и он отлично работает, когда приложение находится на переднем плане. Но это не работает, когда приложение свернуто или закрыто. Я получаю ошибку PlatformException(NO_ACTIVITY, null, null). Ниже мой код.

Android (AppWidgetProvider)

if (methodChannel == null && context != null) {
        FlutterMain.startInitialization(context)
        FlutterMain.ensureInitializationComplete(context, arrayOf())

        // Instantiate a FlutterEngine.
        val engine = FlutterEngine(context.applicationContext)

        // Define a DartEntrypoint
        val entrypoint: DartEntrypoint = DartEntrypoint.createDefault()

        // Execute the DartEntrypoint within the FlutterEngine.
        engine.dartExecutor.executeDartEntrypoint(entrypoint)

        // Register Plugins when in background. When there
        // is already an engine running, this will be ignored (although there will be some
        // warnings in the log).
        //GeneratedPluginRegistrant.registerWith(engine)

        methodChannel = MethodChannel(engine.dartExecutor.binaryMessenger, MainActivity.CHANNEL)
}

methodChannel!!.invokeMethod("fetchNewData", "", object : MethodChannel.Result {
        override fun notImplemented() {
            Toast.makeText(context, "method not implemented", Toast.LENGTH_SHORT).show()
        }

        override fun error(errorCode: String?, errorMessage: String?, errorDetails: Any?) {
            Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show()
        }

        override fun success(result: Any?) {
            Toast.makeText(context, "success", Toast.LENGTH_SHORT).show()
        }
})

Флаттер

/// calling in main
static Future<void> attachListeners() async {
    WidgetsFlutterBinding.ensureInitialized();
    var bloc = new AqiCnDashboardBloc();
    _channel.setMethodCallHandler((call) {
      switch (call.method) {
        case 'fetchNewData':
          bloc.getAqiCn(false);
          return null;
        default:
          throw MissingPluginException('notImplemented');
      }
    });
}

2 ответа

Я собираю информацию / обсуждения, которые перенаправляют нас на запуск движка флаттера в фоновом режиме.

void callbackDispatcher() {
WidgetsFlutterBinding.ensureInitialized();
print("Our background job ran!");

}

void main() {

 static const MethodChannel _channel = const MethodChannel("channel-name");

 Future<void> initialize(final Function callbackDispatcher) async {

  final callback = PluginUtilities.getCallbackHandle(callbackDispatcher);

 await _channel.invokeMethod('initialize', callback.toRawHandle());
 }
}

Как указано здесь. Как запустить Flutter в фоновом режиме?

Когда фоновое задание запускается родным языком, движок Flutter не активен. Итак, мы не можем запустить Dart. Может ли Android/iOS запускать движок Flutter в фоновом режиме? Да! Сначала нам нужно зарегистрировать функцию обратного вызова Dart, которая будет вызываться только всякий раз, когда фоновое задание запускается собственным кодом. Эта функция обратного вызова называется callbackDispatcher.

Также ознакомьтесь с этими обсуждениями stackru.

Flutter: запуск приложения в качестве фоновой службы

Как создать сервис во Flutter, чтобы приложение всегда работало в фоновом режиме?

Как создать фоновую службу Flutter, которая работает даже при закрытии приложения

Запуск Dart в фоновом режиме с плагинами Flutter и Geofencing

Вы можете запустить Flutter Engine в фоновом режиме, зарегистрировав функцию обратного вызова Dart, которая будет вызываться только при запуске фонового задания во Flutter.

Попробуй это.https://medium.com/vrt-digital-studio/flutter-workmanager-81e0cfbd6f6e

Другие вопросы по тегам