Tu app Flutter usa una API Dart respaldada por los motores nativos de iOS y Android con el mismo comportamiento del widget que la integración web.
Instala el paquete Flutter publicado
Fija la versión del paquete publicado en pubspec.yaml o añádela con la CLI de Flutter antes de configurar los proyectos nativos del host.
flutter pub add dobrodesk_sdk:0.2.0Configurar el host de Android
El paquete Flutter publicado enlaza el motor y la UI de Android desde su repositorio Maven local incluido. Añade este repositorio a la compilación raíz de Android antes de la primera sincronización de Gradle. Establece compileSdk en 36, minSdk en 26 y las toolchains de Java/Kotlin en 17. Estos ajustes son necesarios para los artefactos nativos 0.2.0.
Las plantillas antiguas de Flutter pueden incluir versiones del Android Gradle Plugin o Kotlin por debajo de este mínimo. Antes de compilar actualiza juntos el Android Gradle Plugin y el plugin de Kotlin a versiones compatibles con tu versión instalada de Flutter. No modifiques silenciosamente el proyecto generado durante la integración.
La combinación de host probada para Flutter 3.22.3 es Android Gradle Plugin 8.13.2, Kotlin Gradle Plugin 2.2.0, Gradle 8.14.3 y JDK 17. Los hosts generados por Flutter 3.44.2 usan una combinación compatible más nueva. Conserva las versiones generadas por esa versión de Flutter y no las rebajes.
// 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.Usa FlutterFragmentActivity en Android
Conserva la declaración package generada por Flutter y cambia la Activity de entrada de Android a FlutterFragmentActivity. El bridge del widget necesita el ActivityResultRegistryOwner de la activity basada en fragments. Si dejas FlutterActivity, al abrir el widget puede producirse No ActivityResultRegistryOwner.
package com.example.app // keep the package generated for your app
import io.flutter.embedding.android.FlutterFragmentActivity
class MainActivity : FlutterFragmentActivity()Configurar el host de iOS
Establece el target de la app Flutter y cada target de CocoaPods en iOS 15.1 o posterior antes de ejecutar pod install. Conserva el Podfile generado por Flutter y añade el ajuste de deployment en post_install para que el SDK y el host usen el mismo mínimo.
El binario de iOS publicado usa Swift concurrency. Usa Xcode 16.4 o posterior, conserva la versión de Swift compatible con tu versión instalada de Flutter y establece también 15.1 en Deployment Target del target Runner en 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.Configura y presenta el widget
El paquete admite Flutter 3.22.3 o posterior, Dart 3.4 hasta 3.x, Android API 26 e iOS 15.1. El callback credentialProvider pertenece a la aplicación. Debe devolver un JWT de identidad del cliente de corta duración desde tu backend. No incluyas un signing secret ni un support API token en el bundle de 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();Controla el widget inline y su visibilidad
Usa visible: false cuando una ruta keep-alive o un overlay oculte temporalmente la superficie Flutter. La superficie nativa conserva el cliente, la sesión y el borrador. Si no necesitas onError, el SDK muestra su recuperación localizada.
Vuelve a usar visible: true cuando regrese la ruta. Reutiliza el mismo cliente al montar de nuevo.
DobroDeskWidgetView forma parte del paquete publicado de Mobile SDK 0.2.0. Úsalo para la presentación inline y cambia la visibilidad en el mismo cliente para conservar la sesión, el borrador y la outbox offline.
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,
),
);
}Usa el ciclo de vida nativo compartido
El widget es nativo en ambas plataformas y no usa el renderer web en una WebView. Usa client.resetSession() cuando el cliente descarte una conversación y client.logout() antes de cambiar accountScope. logout también libera cualquier capacidad de voz opcional conectada.
Omite reduceMotion de presentWidget salvo que tu app tenga una preferencia explícita del cliente que estés pasando. El SDK nativo respeta de forma predeterminada la preferencia del sistema para reducir movimiento.
Gestiona la carga, la visibilidad y la accesibilidad
La vista nativa muestra sus estados localizados integrados de carga, espera y reintento. Usa los eventos tipados del cliente para un estado de carga del host Flutter y errorBuilder u onError para un aviso de recuperación del host. No superpongas un segundo spinner sobre el campo de entrada mientras el widget muestra su estado de envío.
Mantén la vista montada cuando sea posible. Si la navegación la oculta, conserva el cliente y vuelve a montar la vista con el mismo cliente cuando regrese la ruta. La superficie nativa respeta las preferencias del sistema para reducir movimiento y la escala de animación. El host Flutter sigue siendo responsable de las etiquetas de accesibilidad, el orden de foco y la adaptación al teclado.
- Give the parent a stable height and rebuild with the same client after a route remount.
- Do not call resetSession or logout when the view is temporarily hidden.
- Call logout and dispose the client only when the account ends, then create a new client for the next account.
Verifica el flujo de Flutter
- Presenta desde una ruta Flutter visible y confirma que los toques repetidos no acumulan presentaciones nativas.
- Desde una pantalla de desarrollo, ejecuta startSession, resumeSession, sendMessage con un idempotencyKey estable, refresh y flushOutbox.
- Cambia la preferencia del sistema para reducir movimiento y repite la apertura y el cierre. Confirma que el widget no introduce movimiento cuando el sistema pide reducirlo.