123 lines
4.2 KiB
Markdown
123 lines
4.2 KiB
Markdown
|
|
# 🔗 Переход к прямому вызову Dart кода из JavaScript
|
|||
|
|
|
|||
|
|
## 🎯 **Проблема:**
|
|||
|
|
Получали ошибку "Dart обработчик не определен" из-за проблем с timing'ом и заглушкой.
|
|||
|
|
|
|||
|
|
## ✅ **Решение:**
|
|||
|
|
Убрали заглушку и перешли к прямому вызову Dart функции.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 **Изменения:**
|
|||
|
|
|
|||
|
|
### 1. **Убрали globalDartHandlerScript**
|
|||
|
|
```dart
|
|||
|
|
// УДАЛЕНО из bridge_script.dart:
|
|||
|
|
static const String globalDartHandlerScript = '''
|
|||
|
|
window.dartHandler = function(message) {
|
|||
|
|
console.log('[Web App Bridge] !!!Dart обработчик не определен!!!', message);
|
|||
|
|
};
|
|||
|
|
''';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. **Упростили WebTransport**
|
|||
|
|
```dart
|
|||
|
|
// УДАЛЕНО из bridge_transport.dart:
|
|||
|
|
void _setupDartHandler() {
|
|||
|
|
_evaluateJavaScript(BridgeScript.globalDartHandlerScript);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// УБРАН вызов _setupDartHandler() из initialize()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. **Изменили hostBridgeScript**
|
|||
|
|
```javascript
|
|||
|
|
// БЫЛО:
|
|||
|
|
receiveMessage: function(message) {
|
|||
|
|
if (window.dartHandler) {
|
|||
|
|
window.dartHandler(message);
|
|||
|
|
} else {
|
|||
|
|
console.warn('[Flutter Bridge] Dart обработчик не установлен');
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// СТАЛО:
|
|||
|
|
receiveMessage: function(message) {
|
|||
|
|
window.dartHandler(message); // Прямой вызов без проверки
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. **Изменили порядок инициализации**
|
|||
|
|
```dart
|
|||
|
|
// БЫЛО:
|
|||
|
|
_bridgeManager!.initialize(); // Сначала инициализация
|
|||
|
|
_setupDartHandler(); // Потом Dart обработчик
|
|||
|
|
|
|||
|
|
// СТАЛО:
|
|||
|
|
_setupDartHandler(); // Сначала Dart обработчик
|
|||
|
|
_bridgeManager!.initialize(); // Потом инициализация
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔄 **Новый порядок инициализации:**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. WebBridge.initialize()
|
|||
|
|
↓
|
|||
|
|
2. _initializeBridgeManager()
|
|||
|
|
↓
|
|||
|
|
3. Создание BridgeManager
|
|||
|
|
↓
|
|||
|
|
4. _registerHandlers() ← Регистрация payload handlers
|
|||
|
|
↓
|
|||
|
|
5. _setupDartHandler() ← Установка Dart обработчика ПЕРВЫМ
|
|||
|
|
↓
|
|||
|
|
6. _bridgeManager!.initialize() ← Инициализация bridge ВТОРЫМ
|
|||
|
|
↓
|
|||
|
|
7. WebTransport.initialize() ← Без заглушки
|
|||
|
|
↓
|
|||
|
|
8. Готово! JavaScript может вызывать Dart код
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ **Преимущества нового подхода:**
|
|||
|
|
|
|||
|
|
### 🚀 **Производительность**
|
|||
|
|
- **Нет лишних проверок** в JavaScript
|
|||
|
|
- **Прямой вызов** без промежуточных звеньев
|
|||
|
|
- **Быстрее выполнение** сообщений
|
|||
|
|
|
|||
|
|
### 🛡️ **Надежность**
|
|||
|
|
- **Нет проблем с timing'ом** - Dart обработчик готов к первому вызову
|
|||
|
|
- **Нет заглушки** - исключены ошибки "не определен"
|
|||
|
|
- **Простая логика** - меньше точек отказа
|
|||
|
|
|
|||
|
|
### 🔧 **Простота**
|
|||
|
|
- **Меньше кода** - убрана заглушка и связанная логика
|
|||
|
|
- **Понятная цепочка** - прямой путь от JS к Dart
|
|||
|
|
- **Легче отладка** - нет промежуточных состояний
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 **Результат:**
|
|||
|
|
|
|||
|
|
### ✅ **Достигнутые цели:**
|
|||
|
|
- ✅ Убрана заглушка `globalDartHandlerScript`
|
|||
|
|
- ✅ Упрощен `WebTransport` (убраны лишние методы)
|
|||
|
|
- ✅ Изменен порядок инициализации
|
|||
|
|
- ✅ JavaScript напрямую вызывает Dart функцию
|
|||
|
|
- ✅ Исключены ошибки "Dart обработчик не определен"
|
|||
|
|
|
|||
|
|
### 🚀 **Готовность к использованию:**
|
|||
|
|
Система теперь работает по принципу:
|
|||
|
|
1. **Dart обработчик устанавливается первым**
|
|||
|
|
2. **JavaScript bridge инициализируется вторым**
|
|||
|
|
3. **Все вызовы идут напрямую** без проверок и заглушек
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Переход завершен успешно!** 🎉
|
|||
|
|
|
|||
|
|
Теперь система работает надежно и эффективно с прямым вызовом Dart кода из JavaScript.
|