# πŸ“¦ Flutter WebView Bridge β€” структура ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½ Π½Π° нСзависимыС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ (ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с Melos), Ρ‡Ρ‚ΠΎΠ±Ρ‹: - ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ `host`, `web` ΠΈ `payloads`; - ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ (web Π²ΠΈΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½ΠΎΠ΅); - ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ тСстированиС. --- ## πŸ—‚οΈ ΠžΠ±Ρ‰Π°Ρ структура ``` β”œβ”€β”€ games/ β”‚ β”œβ”€β”€ bridge_core/ # ΠžΠ±Ρ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ сСриализация β”‚ β”œβ”€β”€ payloads_shared/ # Payload'Ρ‹, ΠΎΠ±Ρ‰ΠΈΠ΅ для всСх β”‚ β”œβ”€β”€ payloads_host/ # Волько для host-прилоТСния β”‚ β”œβ”€β”€ payloads_app1/ # Волько для web_app1 β”‚ β”œβ”€β”€ host_app/ # Flutter Host App (с WebView) β”‚ β”œβ”€β”€ web_app1/ # Flutter Web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 1 β”œβ”€β”€ melos.yaml # ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ монорСпозитория ``` --- ## πŸ“¦ ОписаниС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ### `bridge_core/` Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚: - `BridgeMessage` β€” модСль сообщСния - `BridgePayload` β€” абстракция Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… - `PayloadRegistry` β€” ΠΊΠ°Ρ€Ρ‚Π° `"type"` β†’ `fromJson` Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ **всСми** ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ. --- ### `payloads_shared/` Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ payload'Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈ Π² `host`, ΠΈ Π² web-прилоТСниях. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: `GetUserInfoPayload`, `PingPayload`. Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΈ Π² `host_app`, ΠΈ Π² `web_app1`, `web_app2`. --- ### `payloads_host/` Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ payload'Ρ‹, спСцифичныС для хост-прилоТСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: `SecretAdminCommand`, `ShowNativeDialogPayload`. Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ **Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² `host_app`**. --- ### `payloads_app1/` Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ payload'Ρ‹, спСцифичныС для web-прилоТСния 1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: `LoginRequestPayload`, `SubmitQuizPayload`. Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ **Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² `web_app1`** ΠΈ `host_app`. --- ### `host_app/` Flutter-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с WebView. - Π˜ΠΌΠ΅Π΅Ρ‚ доступ ΠΊΠΎ всСм `payloads_*` ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ - ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС события - Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ `BridgeWebViewController` --- ### `web_app1/` Flutter Web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, встроСнноС Π² WebView. - Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ `payloads_*` - РСгистрируСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свои payload'Ρ‹ - НС Π²ΠΈΠ΄ΠΈΡ‚ лишнСго --- ## πŸ” Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ доступа | ΠŸΠ°ΠΊΠ΅Ρ‚ | Π’ΠΈΠ΄ΠΈΡ‚ payloads_shared | Π’ΠΈΠ΄ΠΈΡ‚ payloads_host | Π’ΠΈΠ΄ΠΈΡ‚ payloads_app1 | |---------------|------------------------|----------------------|----------------------| | host_app | βœ… | βœ… | βœ… | | web_app1 | βœ… | ❌ | βœ… | | web_app2 | βœ… | ❌ | ❌ | --- ## βš™οΈ Melos Π€Π°ΠΉΠ» `melos.yaml` Π² ΠΊΠΎΡ€Π½Π΅: ```yaml name: flutter_webview_bridge_repo packages: - packages/** ``` Запуск: ```bash melos bootstrap ``` --- ## πŸ“₯ РСгистрация payload'ΠΎΠ² ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ payload-ΠΏΠ°ΠΊΠ΅Ρ‚ содСрТит: ```dart void registerPayloads() { BridgePayload.register('type_name', (json) => MyPayload.fromJson(json)); } ``` Π’ `main()` Ρƒ прилоТСния: ```dart void main() { registerPayloads(); runApp(MyApp()); } ``` --- ## πŸ“Œ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ```dart // Web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ GetUserInfoPayload(fields: ['name']).toMessage().sendToHost(); // Π₯ост-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ hostBridge.registerHandler('get_user_info', (msg) { final payload = GetUserInfoPayload.fromJson(msg.data); ... }); ``` ---