Как вызвать код платформы из изолята во флаттере?

Я знаю, что существуют библиотеки flutter_isolate и isolate_handler, которые поддерживают это, но я не смог найти какой-либо метод для вызова специфичных для платформы кодов изнутри. Может кто-нибудь показать какой-нибудь пример, как это делается?

1 ответ

Мой ответ может не отвечать на ваш вопрос напрямую, но я столкнулся с той же ситуацией. Я работал над этим, чтобы выполнить интенсивную вычислительную задачу, избегая отставания пользовательского интерфейса. После долгих исследований нет, вы не можете запустить платформу из других изолятов, а не из основного.

Вместо того, чтобы создавать и запускать нативный код на другом изоляте, давайте заставим нативный код работать в фоновом режиме с помощью TaskQueue.Каналы и многопоточность платформы

Пример кода в приведенной выше ссылке использует onAttachedToEngine, можете проверить. Тем не менее, я использовал это, поэтому мне нужно немного разобраться, пока я не нашел решение, которое мне нужно. binaryMessengerчтобы заставить его работать. К счастью, он может вызываться из flutterEngineслишком!

Это пример кода при использовании configureFlutterEngine

      class MainActivity: FlutterFragmentActivity() {

    val MOBILE_SDK_CHANNEL = "com.example.app/flutter"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);

        super.configureFlutterEngine(flutterEngine)
        val taskQueue = flutterEngine.dartExecutor.binaryMessenger.makeBackgroundTaskQueue()

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, MOBILE_SDK_CHANNEL,
                StandardMethodCodec.INSTANCE, taskQueue).setMethodCallHandler { call, result ->
            // TODO : Do implementation here
            when (call.method) {
                "example_method" -> {
                    // success
                    // result.success(data)
                }
                else -> result.notImplemented()
            }
        }
    }
}

С taskQueueсобственный код будет готов к работе в фоновом режиме.

      Future<void> getData() async {
  if (Platform.isAndroid) {
    const platform = MethodChannel("com.example.app/flutter");
    var data = await platform.invokeMethod("example_method");
    // data is ready to use and non-blocked the UI thread
    return data
  }
}

Собственный код теперь работает неблокирующим образом, больше нет задержки пользовательского интерфейса. :)

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