Irbisa · Шпаргалка
Add-to-app и нативная интеграция
FlutterEngine, несколько engine, встраивание в существующее iOS/Android-приложение, Pigeon, плагин или FFI, размер и запуск
Что такое add-to-app и чем Flutter-модуль, созданный через
flutter create -t module, отличается от Flutter-приложения?Чем
FlutterEngineотличается отFlutterActivityилиFlutterViewController, который его показывает?Как добавить Flutter-модуль в существующее iOS-приложение: через SwiftPM, CocoaPods или готовые фреймворки?
# in the Flutter module: generates build/ios/SwiftPackages/, add it to Xcode as a local packageflutter build swift-package --platform ios # build settings of the host targetFLUTTER_SWIFT_PACKAGE_OUTPUT = $(SRCROOT)/../my_flutter/build/ios/SwiftPackagesFLUTTER_APPLICATION_PATH = $(SRCROOT)/../my_flutter # optional: Xcode rebuilds Dart…Как добавить Flutter-модуль в существующее Android-приложение (как зависимость на исходники или как AAR) и чем платите в каждом случае?
// settings.gradle.kts, option 1: source dependency (every host build compiles Dart)apply(from = File(settingsDir.parentFile, "my_flutter/.android/include_flutter.groovy"))// app/build.gradle.kts: implementation(project(":flutter")) // settings.gradle.kts, option 2: AARs from `flutter build aar`dependencyResolutionManagement {…Когда встраивать Flutter на Android как
FlutterActivity, какFlutterFragment, а когда как голыйFlutterView?class HostActivity : FragmentActivity() { private var flutterFragment: FlutterFragment? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.host)…Кто регистрирует плагины, когда вы сами создаёте
FlutterEngine, и какие плагины ломаются в add-to-app?import Flutterimport FlutterPluginRegistrant @mainfinal class AppDelegate: UIResponder, UIApplicationDelegate, @preconcurrency FlutterAppLifeCycleProvider { private let lifecycle = FlutterPluginAppLifeCycleDelegate()…Как нативный хост сообщает Flutter-модулю, какой экран открыть и с какими данными, при первом запуске и при последующих заходах?
// lib/main.dart of the module: the host runs main unless it names another entrypointvoid main() => runApp(const ShopApp()); // kept by the AOT compiler even though no Dart code calls it@pragma('vm:entry-point')void settingsMain() => runApp(const SettingsApp());…Найдите баг: после того как корзину перенесли в приложение Flutter-модулем, этот код блокирует сессию каждый раз, когда пользователь уходит на нативный экран.
class SessionGuard with WidgetsBindingObserver { SessionGuard(this.auth) { WidgetsBinding.instance.addObserver(this); } final AuthService auth; @override void didChangeAppLifecycleState(AppLifecycleState state) { // the user left the app: ask for Face ID when they come back if (state == AppLifecycleState.paused) auth.lock(); }}Найдите баг: каждый раз при открытии профиля появляется пустая пауза, а Flutter-экран забывает всё с прошлого захода.
@MainActorfinal class ProfileCoordinator { func showProfile(userId: String, from host: UIViewController) { let engine = FlutterEngine(name: "profile") engine.run(withEntrypoint: nil, initialRoute: "/profile/\(userId)") GeneratedPluginRegistrant.register(with: engine) let flutterVC = FlutterViewController(engine: engine, nibName: nil, bundle: nil) flutterVC.modalPresentationStyle = .fullScreen host.present(flutterVC, animated: true) }}Как отлаживать Flutter-часть и делать hot reload, если приложение запускается из Xcode или Android Studio как нативное?
Приложение показывает Flutter в нескольких местах сразу: во вкладке, в карточке, в полноэкранном флоу. Зачем нужен
FlutterEngineGroupи что эти engine могут разделять?class App : Application() { lateinit var engines: FlutterEngineGroup override fun onCreate() { super.onCreate() engines = FlutterEngineGroup(this)…Пользователь идёт native → Flutter → native → Flutter. Кто владеет навигацией и жестом «назад» на этой границе?
Как спроектировать API между нативным хостом и Flutter-модулем, чтобы две команды могли безопасно его менять?
В хосте уже есть ядро на C++ и SDK на Kotlin/Swift. Как Flutter-модулю вызывать каждое: через Pigeon,
dart:ffi,ffigenилиjnigen?import 'dart:ffi';import 'dart:io'; // The host already ships the C++ core: Android packages libcore.so,// iOS links it statically into the app binary.final DynamicLibrary _core = Platform.isIOS…Во что хост-приложению обходится Flutter-модуль по размеру загрузки и времени старта и как держать эту цену низкой?
class App : Application() { override fun onCreate() { super.onCreate() // cheap: loads libflutter.so and extracts assets on a background thread FlutterInjector.instance().flutterLoader().startInitialization(this)…Вам поручили переводить большое нативное приложение на Flutter экран за экраном. Как вы спланируете внедрение add-to-app?