Co dnes znamená „hybridní“ mobilní vývoj
Hybridní (přesněji multiplatformní) vývoj umožňuje psát jedinou kódovou základnu pro iOS a Android a sdílet logiku i část uživatelského rozhraní. Dvě dominantní platformy jsou Flutter (Google, jazyk Dart, vlastní vykreslovací engine) a React Native (Meta, JavaScript/TypeScript, vykreslování pomocí nativních prvků). Obě platformy cílí na zrychlení vývoje, snížení nákladů a jednotný design a uživatelský zážitek, ale liší se architekturou, výkonem a rozšiřitelností.
Architektonické rozdíly: vykreslování, bridge a runtime
- Flutter: vykresluje uživatelské rozhraní kompletně pomocí Skia/Impeller (Metal/Vulkan/OpenGL). Vykresluje vlastní pixely a nespoléhá na nativní prvky UI. Poskytuje konzistentní vzhled, vysokou míru kontroly nad animacemi a předvídatelné chování napříč operačními systémy.
- React Native (RN): využívá nativní prvky (UIKit/SwiftUI v iOS, Views/Compose v Androidu) a řídí je z JavaScriptu/TypeScriptu. Nová architektura (JSI, TurboModules, Fabric) minimalizuje režii historického „bridge“ a zvyšuje propustnost událostí.
- Runtime: Flutter kompiluje Dart pomocí AOT pro vydanou verzi aplikace (rychlé spuštění, menší kolísání snímkové frekvence), v režimu ladění používá JIT + hot reload. RN spouští JS na JavaScriptovém enginu (Hermes/JavaScriptCore); ve vydané verzi se obvykle používá Hermes, který snižuje spotřebu paměti a zrychluje inicializaci.
Výkon, paměť a spuštění aplikace
- Spuštění: Flutter má konstantní režii enginu (větší binární soubor), ale velmi rychle vykreslí první snímek. RN závisí na inicializaci JS enginu a načtení balíčku; Hermes zlepšuje studený start.
- FPS a animace: Flutter vyniká u náročných animací (Canvas, efekty shaderů). RN s Fabric a animacemi využívajícími nativní ovladač je konkurenceschopný, ale složité grafické scény se snáze realizují ve Flutteru.
- Paměť: RN sdílí paměť s JS enginem; je nutné pečlivě pracovat s objekty a uzávěry. Flutter uchovává strom widgetů a prostředky – sledujte image cache a životní cykly.
Jazyky a paradigmata
- Dart (Flutter): silná typová kontrola, AOT, null safety, jednotný ekosystém. Reaktivní UI prostřednictvím stromu Widget a neměnných (immutable) konfigurací.
- TypeScript/JavaScript (RN): rozsáhlá komunita, sdílení kódu s webem, bohatý ekosystém NPM. Pro spolehlivost vyžaduje důslednost (ESLint, přísné nastavení TypeScriptu).
Správa stavu a architektury
- Flutter: Provider, Riverpod, BLoC/Cubit, GetX, MobX. Doporučuje se „jednosměrný tok dat“ (BLoC/Riverpod) a oddělení I/O do repozitářů.
- RN: Redux Toolkit, Zustand, Recoil, MobX, Jotai. V praxi se pro načítání dat používají RTK Query/React Query a Redux pouze pro stav sdílený napříč obrazovkami.
- Architektura: Clean Architecture s doménovými vrstvami (Entities, Use Cases, Repositories) je přenositelná do obou prostředí.
Navigace a routování
- Flutter: Navigator 2.0 (deklarativní), knihovny go_router, auto_route – snadná práce s deep linky a chráněnými routami.
- RN: React Navigation, nativní zásobník (react-native-screens) pro vyšší výkon; podpora deep linků a univerzálních odkazů.
Přístup k nativním API a vlastní moduly
- Flutter: platform channels (MethodChannel/EventChannel) pro iOS/Android; vývoj pluginů ve Swiftu/Kotlinu. Opakovaně použitelné balíčky na pub.dev.
- RN: TurboModules (C++/JSI) a Fabric pro UI; most pro starší moduly. Nativní kód ve Swiftu/Kotlinu/ObjC/Java, případně C++ pro vyšší výkon.
Uživatelské rozhraní a designové systémy
- Flutter: Material a Cupertino s podrobnou kontrolou stylů; adaptivní komponenty; vlastní render objects pro zvláštní rozvržení.
- RN: nativní vzhled a chování „zdarma“, snadné dodržení zvyklostí jednotlivých platforem; pro konzistenci se používají designové knihovny (Paper, NativeBase) a tokeny.
Přístupnost (a11y), lokalizace a RTL
- Přístupnost: Flutter má strom Semantics; RN využívá nativní role pro přístupnost. Důležité je testovat čtečky obrazovky (VoiceOver/TalkBack) a dotykové cíle o velikosti alespoň 48 dp.
- Lokalizace: Flutter – pracovní postup intl + ARB; RN – i18n (i18next), množné číslo, formátování dat; pozor na RTL a formátování číslic.
Datová vrstva: REST, GraphQL a offline režim
- REST: Flutter – dio/http + interceptory; RN – axios/fetch + React Query pro ukládání do mezipaměti a opakování požadavků.
- GraphQL: Flutter/RN – Apollo/Urql/Artemis; normalizované mezipaměti, optimistic UI, odběry.
- Offline režim: Flutter – Hive, Isar, Drift; RN – WatermelonDB, Realm, MMKV. Konflikty řešte pomocí CRDT nebo slučováním na straně serveru.
Testování a kvalita
- Flutter: unit, widget a integrační testy (flutter_test, integration_test), snímky v rámci golden tests, zastaralý nástroj flutter_driver.
- RN: jednotkové testy (Jest), testy komponent (React Testing Library), e2e testy (Detox/Appium). Snapshot testy pro odhalování regresí v UI.
- Společné: statická analýza (Dart analyzer / ESLint + TS), hooky pre-commit, SAST/DAST v CI.
CI/CD, podepisování a distribuce
- CI: GitHub Actions, GitLab CI, Bitrise, Codemagic; ukládání artefaktů sestavení do mezipaměti (Gradle, CocoaPods, Dart pub/NPM).
- Podepisování: iOS profiles/certificates (Fastlane Match), Android keystore a podepisování v2/v3; správa tajných údajů pomocí Secure Enclave/Secrets.
- Distribuce: TestFlight, Firebase App Distribution, interní testování v Play; feature flags a postupné nasazování.
Bezpečnost a compliance
- Bezpečné ukládání tokenů (Keychain/Keystore, Flutter flutter_secure_storage, RN react-native-keychain).
- Připnutí certifikátů, TLS, ochrana proti MITM; kontrola certificate transparency.
- Obfuskace/odstranění duplicitních symbolů (Flutter –obfuscate, ProGuard/R8 v RN), minimalizace (minify) balíčku JS, ochrana proti neoprávněným zásahům.
- Audit GDPR/SDK: minimalizujte zapojení třetích stran, používejte privacy manifesty (iOS), Data safety form (Play).
Monitoring, telemetrie a výkon v produkci
- Pády a protokoly: Firebase Crashlytics/Sentry pro Flutter i RN; symbolikace pomocí dSYM/ProGuard mapping.
- Výkon: Flutter DevTools (doby vykreslení snímků, kompilace shaderů), RN Flipper (síť, rozvržení, výkon).
- Trasování: OpenTelemetry/Performance Monitoring, odpovědnost za metriky „klíčových cest“ (TTI, FID, studený/teplý start).
Modularita, monorepo a sdílení kódu
- Flutter: Melos pro monorepo, modulární balíčky, společné designové tokeny v Dartu.
- RN: Yarn Workspaces/Turborepo, sdílené knihovny UI, sestavení pomocí tsup/esbuild. Sdílení logiky s webem je snadné (izomorfní JS/TS).
Integrace s nativními obrazovkami a postupné zavádění
- Flutter: vložení pomocí Add-to-App do stávajících nativních projektů (hostitelská Activity/ViewController). Užitečné pro postupnou migraci.
- RN: lze jej přidat jako modul a postupně přepisovat obrazovky; Fabric usnadňuje integraci s nativním rozvržením.
Tabulka: rychlé srovnání Flutteru a React Native
| Kategorie | Flutter | React Native |
|---|---|---|
| Vykreslování UI | Vlastní (Skia/Impeller), konzistentní napříč OS | Nativní prvky (Fabric), „domácí“ vzhled a chování |
| Jazyk | Dart (null-safe, AOT/JIT) | TypeScript/JS (Hermes/JSC) |
| Spuštění aplikace | Rychlé vykreslení prvního snímku, větší binární soubor | Závisí na JS enginu; Hermes zlepšuje studený start |
| Animace a grafika | Velmi dobré, vlastní vykreslování/shadery | Dobré s Fabric a nativním ovladačem; složité scény jsou náročnější |
| Sdílení s webem | Flutter Web (jiný strom vykreslování) | Rozsáhlé (knihovny JS/TS sdílené s webem) |
| Nativní integrace | Platform Channels, pluginy | TurboModules/JSI, bohatý ekosystém NPM |
| Ekosystém | pub.dev, kurátorované balíčky | NPM, obrovská šíře nabídky, proměnlivá kvalita |
| Křivka učení | Nový jazyk, ale konzistentní framework | Přirozená volba pro webové vývojáře (React/TS) |
Kritéria výběru podle projektu
- Konzistence značky a animace: vítězí Flutter (plná kontrola nad vykreslováním pixelů).
- Propojení s webem a sdílení knihoven: RN s TS je pragmatická volba.
- Nový projekt vs. „add-to-app“: obojí je možné; Flutter nabízí velmi robustní nástroje Add-to-App.
- Požadavky na přístupnost nativních komponent: RN těží z nativních ovládacích prvků; ve Flutteru je třeba pečlivě ladit Semantics.
Kontrolní seznam optimalizace (produkce)
- Minimalizujte prostředky (SVG/VectorDrawable), těžké obrazovky načítejte až podle potřeby.
- Udržujte stabilní FPS: vyhněte se náročným synchronním výpočtům v hlavním vlákně (Flutter Isolates, RN JSI/Workers).
- Memoizace a selektivní opětovné vykreslování: const widgets / shouldComponentUpdate/memo.
- Sledujte zadrhávání při kompilaci shaderů (Flutter – SkSL warmup); v RN spouštějte animace na nativní straně.
- Používejte Hermes v RN, AOT ve vydané verzi Flutteru, zapněte ProGuard/R8 a dead-code elimination.
Organizační praxe: tým, role a procesy
- Designové tokeny sdílené mezi platformami; generování pro Dart/TS.
- Kontrakty API (OpenAPI/GraphQL schema) verzované a ověřované v CI.
- Správa příznaků funkcí, experimenty (A/B), remote config pro řízení rizik při postupném nasazování.
- Plán vydávání (týdenní/čtrnáctidenní), jasně stanovené metriky pro rozhodnutí o nasazení (procento aplikací bez pádů, studený start, TTI).
Typické vzory (patterny)
- „Core + Shell“: doménová logika jako modul pure Dart/TS, tenká vrstva UI pro Flutter/RN.
- „Ports & Adapters“: platformní služby (úložiště, senzory) prostřednictvím rozhraní; snadné vytváření mocků a testování.
- „Preview Apps“: automatické vytváření preview buildů z pull requestů pro kontrolu UX.
Časté anti-patterny
- „Everything in one file“ – špatná čitelnost a nemožnost refaktoringu; rozdělte kód do modulů.
- Neřízené vedlejší efekty v komponentách/widgetech – používejte efektové hooky/Bloc Streams s řízením životního cyklu.
- Míchání UI a I/O – dodržujte clean arch (UI ↔ UseCase ↔ Repo ↔ DataSource).
- Spoléhání na magické knihovny bez auditu – sledujte jejich údržbu, licenční podmínky a velikost.
Dlouhodobá udržitelnost a plán dalšího vývoje
- Flutter: renderer Impeller (méně zadrhávání při kompilaci shaderů), cílení na desktop a vestavěná zařízení; stabilní null safety a rychlé nástroje.
- RN: sjednocování nové architektury (Fabric/Turbo), Hermes jako výchozí engine, těsnější vazba na nativní UI a výkon.
Závěrečné doporučení
Pro projekty, které vyžadují výraznou vizuální identitu, plynulé animace a konzistenci, je Flutter volbou číslo jedna. Pokud vaše organizace těží ze sdílení kódu s webem, TypeScriptu a nativního vzhledu, zvolte React Native s novou architekturou a Hermem. V obou případech investujte do testování, monitoringu a automatizace – právě tyto postupy rozhodují o tom, zda vám „hybridní“ přístup skutečně sníží celkové náklady na vlastnictví (TCO) a urychlí dodávání hodnoty.
Rychlý rozhodovací strom
- Potřebuji sdílet knihovny s webem (TS/JS)? → RN.
- Potřebuji animace přesné na úrovni snímků a plnou kontrolu nad pixely? → Flutter.
- Mám stávající nativní aplikaci a chci přidat několik obrazovek? → Flutter Add-to-App nebo modul RN – vyberte podle dovedností týmu.
- Požaduji co nejnižší latenci UI na starším hardwaru? → Otestujte obě řešení v produkční konfiguraci (Hermes vs. AOT) a vyberte empiricky.
