148 lines
3.9 KiB
Markdown
148 lines
3.9 KiB
Markdown
|
|
# 📦 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);
|
|||
|
|
...
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|