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