Связь Flutter с нативным кодом
Вопрос
Как вызвать нативный код из Flutter? Расскажите про варианты и как вы выбираете.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
`MethodChannel` для вызовов, `EventChannel` для потоков, `BasicMessageChannel` для сообщений
Асинхронность и стандартный кодек: какие типы можно передать
Обработка `PlatformException` и `MissingPluginException`
Pigeon для типобезопасного контракта
FFI для библиотек на C/C++/Rust, синхронно и без сериализации
Обработчики в главном потоке платформы: тяжёлое в фон
Что могут спросить следом
- Как передать свой класс через канал?
- Как сделать поток событий с датчика?
- Чем плох опрос через MethodChannel по таймеру?
Разбор
Образцовый ответ: «Для разовых вызовов использую MethodChannel: из Dart invokeMethod, на платформе обработчик с тем же именем канала отвечает через result. Для потоков, например датчиков или геолокации, EventChannel: Dart получает Stream, платформа шлёт события в EventSink, а в onCancel отписывается от источника. Данные идут через стандартный кодек: примитивы, строки, байты, списки и мапы, свои классы перевожу в мапы. Ошибки ловлю как PlatformException и MissingPluginException. В новом коде предпочитаю Pigeon: он генерирует типизированный контракт для Dart, Kotlin и Swift, и опечатки ловит компилятор. Если нужна библиотека на C или Rust, беру FFI. Помню, что обработчики работают в главном потоке платформы, поэтому тяжёлую работу увожу в фон»
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.