# πŸš€ План Ρ€Π°Π±ΠΎΡ‚Ρ‹: Flutter WebView Bridge ## πŸ“‹ ΠžΠ±Π·ΠΎΡ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ монорСпозитория с Melos для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ двустороннСго взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ Flutter-хостом ΠΈ Flutter Web-прилоТСниями Ρ‡Π΅Ρ€Π΅Π· WebView. **Бсылки Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ:** - [АрхитСктура ΠΈ этапы Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ](flutter_webview_bridge_plan.md#Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°-ΠΏΠ°ΠΊΠ΅Ρ‚Π°) - [Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° монорСпозитория](PROJECT_STRUCTURE.md#общая-структура) --- ## 🎯 Π¦Π΅Π»ΠΈ ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ ### ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ†Π΅Π»ΠΈ 1. **Π˜Π·ΠΎΠ»ΡΡ†ΠΈΡ зависимостСй** - web-прилоТСния видят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ payload'Ρ‹ 2. **Π’ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ** - строгая типизация всСх сообщСний 3. **ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ** - Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ web-прилоТСния 4. **Π’Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ** - нСзависимоС тСстированиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ### ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ готовности - [ ] ВсС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ созданы ΠΈ настроСны Π² Melos - [ ] Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ взаимодСйствиС host ↔ web Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ - [ ] БистСма payload'ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ - [ ] ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ - [ ] ВСсты ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ основныС сцСнарии --- ## πŸ“… Π­Ρ‚Π°ΠΏΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ### Π­Ρ‚Π°ΠΏ 1: Настройка монорСпозитория (1 дСнь) **Π—Π°Π΄Π°Ρ‡ΠΈ:** 1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΡ€Π½Π΅Π²ΡƒΡŽ структуру ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° 2. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ `melos.yaml` согласно [структурС](PROJECT_STRUCTURE.md#общая-структура) 3. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ зависимостями 4. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ `pubspec.yaml` для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° **Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:** Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с `melos bootstrap` **Π€Π°ΠΉΠ»Ρ‹ для создания:** ``` games/ β”œβ”€β”€ melos.yaml β”œβ”€β”€ bridge_core/ β”œβ”€β”€ payloads_shared/ β”œβ”€β”€ payloads_host/ β”œβ”€β”€ payloads_app1/ β”œβ”€β”€ host_app/ └── web_app1/ ``` Π—Π΄Π΅ΡΡŒ ΠΈ Π΄Π°Π»Π΅Π΅, web_app1 - ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ тСстируСтся ΠΏΠ»Π°Π³ΠΈΠ½. --- ### Π­Ρ‚Π°ΠΏ 2: РСализация bridge_core (2 дня) **Π—Π°Π΄Π°Ρ‡ΠΈ:** 1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ `BridgeMessage` модСль (см. [модСль сообщСния](flutter_webview_bridge_plan.md#модСль-сообщСния)) 2. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ `BridgePayload` Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ 3. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ `PayloadRegistry` для рСгистрации Ρ‚ΠΈΠΏΠΎΠ² 4. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ/Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ **ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ классы:** ```dart // bridge_core/lib/src/models/bridge_message.dart // bridge_core/lib/src/models/bridge_payload.dart // bridge_core/lib/src/registry/payload_registry.dart ``` **Зависимости:** `uuid: ^4.0.0` --- ### Π­Ρ‚Π°ΠΏ 3: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ payload-ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (1-2 дня) **Π—Π°Π΄Π°Ρ‡ΠΈ:** 1. **payloads_shared**: ΠΎΠ±Ρ‰ΠΈΠ΅ payload'Ρ‹ (Ping, GetUserInfo) 2. **payloads_host**: спСцифичныС для хоста (SecretAdmin, ShowNativeDialog) 3. **payloads_app1**: спСцифичныС для web_app1 (Login, SubmitQuiz) **Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ payload-ΠΏΠ°ΠΊΠ΅Ρ‚Π°:** ```dart // РСгистрация Ρ‚ΠΈΠΏΠΎΠ² void registerPayloads() { BridgePayload.register('ping', (json) => PingPayload.fromJson(json)); BridgePayload.register('get_user_info', (json) => GetUserInfoPayload.fromJson(json)); } ``` **Бсылка Π½Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ доступа:** [Π’Π°Π±Π»ΠΈΡ†Π° доступа](PROJECT_STRUCTURE.md#Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅-доступа) --- ### Π­Ρ‚Π°ΠΏ 4: Flutter Host ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (3-4 дня) **Π—Π°Π΄Π°Ρ‡ΠΈ:** 1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ `BridgeWebViewController` (см. [WebView ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€](flutter_webview_bridge_plan.md#webview-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€)) 2. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ JavaScript handler для ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний 3. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сообщСний Π² WebView 4. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ UI с WebView Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ **ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:** - `host_app/lib/src/bridge_webview_controller.dart` - `host_app/lib/src/bridge_webview.dart` - `host_app/lib/src/handlers/` - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ payload'ΠΎΠ² **Зависимости:** `flutter_inappwebview: ^6.0.0` **Бсылка Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€:** [Flutter Host ΠΏΡ€ΠΈΠΌΠ΅Ρ€](flutter_webview_bridge_plan.md#flutter-host-ΠΏΡ€ΠΈΠΌΠ΅Ρ€) --- ### Π­Ρ‚Π°ΠΏ 5: JavaScript Bridge (1 дСнь) **Π—Π°Π΄Π°Ρ‡ΠΈ:** 1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ `web/bridge.js` для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий 2. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Flutter Web 3. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² HTML ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ **Бсылка Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ:** [JavaScript Bridge](flutter_webview_bridge_plan.md#javascript-bridge) **Π€Π°ΠΉΠ»Ρ‹:** - `web_app1/web/bridge.js` - `web_app1/web/index.html` --- ### Π­Ρ‚Π°ΠΏ 6: Flutter Web ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (2-3 дня) **Π—Π°Π΄Π°Ρ‡ΠΈ:** 1. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ `WebBridge` класс (см. [Web Bridge класс](flutter_webview_bridge_plan.md#web-bridge-класс)) 2. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний ΠΎΡ‚ хоста 3. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ UI прилоТСния 4. Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с JavaScript bridge **ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:** - `web_app1/lib/src/web_bridge.dart` - `web_app1/lib/src/handlers/` - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ payload'ΠΎΠ² **Бсылка Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€:** [Flutter Web ΠΏΡ€ΠΈΠΌΠ΅Ρ€](flutter_webview_bridge_plan.md#flutter-web-ΠΏΡ€ΠΈΠΌΠ΅Ρ€) --- ### Π­Ρ‚Π°ΠΏ 7: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΈ тСстированиС (2-3 дня) **Π—Π°Π΄Π°Ρ‡ΠΈ:** 1. ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ всС зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ 2. ΠŸΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» сообщСний 3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ payload'ΠΎΠ² 4. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ unit ΠΈ integration тСсты **ВСстовыС сцСнарии:** - Ping/Pong ΠΌΠ΅ΠΆΠ΄Ρƒ host ΠΈ web - ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… - ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок ΠΈ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° изоляции payload'ΠΎΠ² **Бсылка Π½Π° тСсты:** [Unit тСсты](flutter_webview_bridge_plan.md#unit-тСсты) --- ### Π­Ρ‚Π°ΠΏ 8: ДокумСнтация ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ (1-2 дня) **Π—Π°Π΄Π°Ρ‡ΠΈ:** 1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ README для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° 2. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования 3. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ API 4. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ troubleshooting guide **Бсылка Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ:** [README.md](flutter_webview_bridge_plan.md#readmemd) --- ## πŸ”§ ВСхничСскиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ### Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимостями ```yaml # melos.yaml name: flutter_webview_bridge_repo packages: - packages/bridge_core - packages/payloads_shared - packages/payloads_host - packages/payloads_app1 - apps/host_app - apps/web_app1 ``` ### Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° payload'ΠΎΠ² ```dart // ΠŸΡ€ΠΈΠΌΠ΅Ρ€ payload class GetUserInfoPayload extends BridgePayload { final List fields; GetUserInfoPayload({required this.fields}); @override Map toJson() => {'fields': fields}; factory GetUserInfoPayload.fromJson(Map json) => GetUserInfoPayload(fields: List.from(json['fields'])); } ``` ### РСгистрация Π² прилоТСниях ```dart // Π’ main() ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ прилоТСния void main() { registerPayloads(); // РСгистрируСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ runApp(MyApp()); } ``` --- ## 🚨 Риски ΠΈ митигация ### Риск 1: Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ настройки Melos **ΠœΠΈΡ‚ΠΈΠ³Π°Ρ†ΠΈΡ:** ΠΠ°Ρ‡Π°Ρ‚ΡŒ с простой структуры, постСпСнно ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ ### Риск 2: ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с WebView Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… **ΠœΠΈΡ‚ΠΈΠ³Π°Ρ†ΠΈΡ:** Π’Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Android/iOS/Web с самого Π½Π°Ρ‡Π°Π»Π° ### Риск 3: Π£Ρ‚Π΅Ρ‡ΠΊΠΈ памяти Π² callback'Π°Ρ… **ΠœΠΈΡ‚ΠΈΠ³Π°Ρ†ΠΈΡ:** Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ очистку --- ## πŸ“Š ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ успСха - [ ] `melos bootstrap` выполняСтся Π±Π΅Π· ошибок - [ ] Ping/Pong Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ host ΠΈ web - [ ] Payload'Ρ‹ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ (web_app1 Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ payloads_host) - [ ] ВСсты ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ >80% ΠΊΠΎΠ΄Π° - [ ] ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… --- ## 🎯 Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги 1. **Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ структуру монорСпозитория** 2. **ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Melos ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ** 3. **ΠΠ°Ρ‡Π°Ρ‚ΡŒ с bridge_core ΠΏΠ°ΠΊΠ΅Ρ‚Π°** 4. **ΠŸΠΎΡΡ‚Π΅ΠΏΠ΅Π½Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹** **ΠžΠ±Ρ‰Π΅Π΅ врСмя:** 10-15 Π΄Π½Π΅ΠΉ **ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚:** Высокий для core Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ