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

Я работаю над собственным виджетом Android в приложении Flutter. В котором есть кнопка refre sh, при нажатии на которую я должен вызвать метод в коде Flutter. Я использую канал метода Flutter для связи, и он отлично работает, когда приложение находится на переднем плане. Но это не работает, когда приложение свернуто или закрыто. Я получаю сообщение об ошибке 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()
        }
})

Flutter

/// 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 ]

0 голосов
/ 20 августа 2020

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

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 в background?

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

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

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

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

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

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

0 голосов
/ 13 августа 2020

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

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

...