mnemo_cards/games/PROJECT_STRUCTURE.md
2025-11-11 02:55:41 +03:00

148 lines
No EOL
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📦 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);
...
});
```
---