Ваш Flutter застосунок використовує один Dart API на основі нативних рушіїв iOS та Android із тією самою поведінкою віджета, що й вебінтеграція.
Установіть опублікований Flutter-пакет
Зафіксуйте версію опублікованого пакета у pubspec.yaml або додайте її через Flutter CLI перед налаштуванням нативних проєктів хоста.
flutter pub add dobrodesk_sdk:0.2.0Налаштуйте Android-хост
Опублікований Flutter-пакет підключає Android-рушій і UI з bundled локального Maven-репозиторію. Додайте цей репозиторій до кореневого Android-проєкту до першої синхронізації Gradle. Установіть compileSdk 36, minSdk 26 і Java/Kotlin toolchains 17. Ці налаштування потрібні нативним артефактам 0.2.0.
Старі шаблони Flutter можуть містити версії Android Gradle Plugin або Kotlin нижче цього рівня. Перед збіркою оновіть Android Gradle Plugin і Kotlin Plugin разом до версій, які підтримує встановлена версія Flutter. Не змінюйте згенерований проєкт непомітно під час інтеграції.
Перевірений набір для хоста Flutter 3.22.3: Android Gradle Plugin 8.13.2, Kotlin Gradle Plugin 2.2.0, Gradle 8.14.3 і JDK 17. Згенеровані Flutter 3.44.2 хости використовують новіший сумісний набір. Зберігайте версії, створені цим релізом Flutter, і не знижуйте їх.
// Kotlin DSL root template: android/build.gradle.kts
allprojects {
repositories {
google()
mavenCentral()
maven { url = uri(project(":dobrodesk_sdk").projectDir.resolve("../native/maven")) }
}
}
// android/app/build.gradle.kts
android {
compileSdk = 36
defaultConfig { minSdk = 26 }
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
kotlin { jvmToolchain(17) }
// Groovy root template: android/build.gradle
allprojects {
repositories {
google()
mavenCentral()
maven { url = uri(new File(project(":dobrodesk_sdk").projectDir, "../native/maven")) }
}
}
// Keep the equivalent compileSdk/minSdk, Java 17 and Kotlin 17 settings in
// android/app/build.gradle when the generated app uses Groovy DSL.Використовуйте FlutterFragmentActivity на Android
Залиште package declaration, який згенерував Flutter, і змініть головну Android Activity на FlutterFragmentActivity. Bridge віджета потребує ActivityResultRegistryOwner від fragment activity. Якщо залишити згенеровану FlutterActivity, відкриття віджета може впасти з помилкою No ActivityResultRegistryOwner.
package com.example.app // keep the package generated for your app
import io.flutter.embedding.android.FlutterFragmentActivity
class MainActivity : FlutterFragmentActivity()Налаштуйте iOS-хост
Задайте для target Flutter-застосунку та кожного CocoaPods target iOS 15.1 або новішу версію до запуску pod install. Залиште згенерований Flutter Podfile і додайте параметр розгортання в post_install, щоб SDK та хост мали однаковий мінімальний рівень.
Опублікований iOS-бінарник використовує Swift concurrency. Використовуйте Xcode 16.4 або новішу версію, Swift-версію, яку підтримує встановлена версія Flutter, а також задайте 15.1 у Deployment Target для Runner в Xcode.
platform :ios, '15.1'
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.1'
end
end
end
# Also set Runner > Deployment Target to 15.1 in Xcode.Налаштуйте й відкрийте віджет
Пакет підтримує Flutter 3.22.3 і новіші версії, Dart 3.4 до 3.x, Android API 26 та iOS 15.1. Зворотний виклик credentialProvider — це функція застосунку. Вона має повертати короткоживучий customer identity JWT з вашого бекенда. Не вбудовуйте signing secret або support API token у Flutter-бандл.
import "package:dobrodesk_sdk/dobrodesk_sdk.dart";
final client = DobroDeskFlutterClient(
integrationId: "wgt_0123456789abcdef0123456789abcdef",
apiOrigin: "https://dobrodesk.com",
accountScope: currentCustomer.id,
locale: "en",
credentialProvider: () async => loadDobroDeskToken(),
);
await client.presentWidget();Відрендерте inline або використайте власний тригер
DobroDeskWidgetView вбудовує нативну iOS або Android поверхню у Flutter layout. Задайте батьківському елементу сталий розмір, щоб екран не перебирав компонування під час автентифікації та завантаження. Якщо callback onError не потрібен, SDK покаже локалізований стан відновлення.
Видалення view звільняє inline-власника без скидання сесії чи чернетки. Передавайте visible: false для тимчасово прихованого keep-alive маршруту або overlay, а visible: true після повернення. Повторно використовуйте той самий client під час remount.
DobroDeskWidgetView входить до опублікованого пакета Mobile SDK 0.2.0. Використовуйте його для inline-відображення й змінюйте видимість на тому самому клієнті, щоб зберігати сесію, чернетку та offline outbox.
import "package:flutter/widgets.dart";
import "package:dobrodesk_sdk/dobrodesk_sdk.dart";
Widget buildSupportPanel(
DobroDeskFlutterClient client, {
bool routeIsVisible = true,
}) {
return SizedBox(
height: 560,
child: DobroDeskWidgetView(
client: client,
options: const NativeWidgetOptions(
locale: "en",
view: "home",
),
visible: routeIsVisible,
),
);
}Використовуйте спільний нативний життєвий цикл
Віджет нативний на обох платформах і не використовує вебрендерер у WebView. Використовуйте client.resetSession(), коли клієнт відкидає розмову, і client.logout() перед зміною accountScope. logout також звільняє під'єднану додаткову voice-можливість.
Не передавайте reduceMotion у presentWidget, якщо у вашому застосунку немає явного налаштування клієнта, яке ви передаєте далі. Нативний SDK за замовчуванням поважає системне reduced motion.
Керуйте завантаженням, від'єднанням і доступністю
Нативний view показує вбудовані локалізовані стани завантаження, очікування та повтору. Використовуйте типізовані події клієнта для зовнішнього loading state Flutter і errorBuilder або onError для відновлюваного повідомлення хоста. Не накладайте другий spinner на поле вводу, коли віджет показує стан надсилання.
disposeInlineWidget звільняє inline-власника без resetSession чи logout. Сталі bounds, safe area й keyboard insets залишаються відповідальністю Flutter host, а native surface поважає системний reduced motion.
- Задайте батьківському елементу сталу висоту й перебудовуйте view з тим самим client.
- Не викликайте resetSession або logout, коли view тимчасово приховано.
- Викликайте logout і dispose client лише після завершення акаунта.
Перевірте Flutter-флоу
- Відкрийте віджет із видимого Flutter-маршруту й перевірте, що повторні натискання не накопичують нативні презентації.
- З тестового екрана виконайте startSession, resumeSession, sendMessage зі стабільним idempotencyKey, refresh і flushOutbox.
- Змініть системне налаштування reduced motion і повторіть відкриття та закриття. Перевірте, що віджет не запускає рух, коли система вимагає зменшити анімації.