Documentazione

Flutter SDK

Un client interamente in Dart per la chat di assistenza Respondo — nessun codice nativo di piattaforma da compilare o debuggare.

Requisiti#

  • Dart >=3.4.0 <4.0.0.
  • Flutter >=3.16.0 (la linea 3.x).
  • Dart puro: nessun bridge nativo, nessun pod install, nessuna modifica a Gradle. Le dipendenze transitive sono normali package Dart (http, web_socket_channel, uuid).

Installazione#

Aggiungi il package da pub.dev:

pubspec.yamlyaml
dependencies:
  respondo_sdk: ^0.1.2
Dartdart
import 'package:respondo_sdk/respondo_sdk.dart';

Inizializzazione#

Collega Respondo.navigatorKey al tuo MaterialApp così l’SDK può aprire lo sheet della chat senza il tuo BuildContext, chiama Respondo.init una volta, poi Respondo.open().

main.dartdart
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:respondo_sdk/respondo_sdk.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // La directory di storage dei file viene da un plugin dell'app host; l'SDK resta puro.
  final dir = await getApplicationSupportDirectory();

  await Respondo.init(
    RespondoConfig(
      agentId: '<agent-uuid>',
      channelId: '<channel-uuid>',
      storageDirectory: dir.path,
    ),
  );

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: Respondo.navigatorKey, // richiesto affinché l'SDK possa aprire la chat
      home: Scaffold(
        body: Center(
          child: FilledButton(
            onPressed: () => Respondo.open(),
            child: const Text('Support'),
          ),
        ),
      ),
    );
  }
}

Tutti i metodi della facade sono idempotenti, sicuri da chiamare prima di init (accodano e riproducono) e non sollevano mai eccezioni nella tua app.

Identificare gli utenti#

Per impostazione predefinita ogni visitatore è anonimo. Al primo avvio l’SDK genera un visitor_id stabile e lo conserva nello storage locale, così un utente che torna ritrova la sua conversazione. Non c’è alcuna chiave API da incorporare — ogni conversazione è protetta da un token di sessione per conversazione che il backend emette e fa avanzare a ogni messaggio, così un visitatore anonimo non deve mai autenticarsi di nuovo.

Chiama identify non appena l’utente è autenticato. Questo collega la sua identità reale, così la sua cronologia lo segue tra dispositivi e reinstallazioni, e il suo nome ed email compaiono accanto alla conversazione nella tua inbox invece di un visitatore anonimo.

Lo userHash è una firma che il tuo backend calcola a partire dall’ identity_secret dell’agente — HMAC-SHA256(secret, userId) (o l’email quando non c’è userId), codificata in esadecimale minuscolo. Il secret dimostra che l’identità è autentica, quindi deve risiedere solo sul tuo backend e non va mai incluso nell’app. Consulta la pagina Verifica dell’identità per la formula completa e gli esempi lato server.

Dartdart
// 1. Autentica sul tuo backend e leggi l'hash precalcolato
//    (per esempio, un campo restituito insieme alla risposta di login).
final session = await api.login(email, password);

// 2. Passa lo userHash già pronto all'SDK — non calcolarlo mai nell'app.
Respondo.identify(RespondoIdentity(
  userId: session.userId,
  email: session.email,
  name: session.fullName,
  userHash: session.respondoUserHash,
));

// 3. Al logout: revoca la sessione e avvia un nuovo visitatore anonimo.
Respondo.reset();

Se l’hash manca o è errato, non viene sollevata alcuna eccezione: il backend mantiene silenziosamente il visitatore anonimo, la chat continua a funzionare e si perde semplicemente il collegamento tra dispositivi finché non viene fornito un hash valido. La verifica viene eseguita solo quando l’agente ha un identity_secret impostato — lascialo vuoto durante lo sviluppo e userId / email vengono accettati così come sono.

Observable & callback#

Tutto è disponibile come Stream broadcast, come setter di callback e come getter del valore corrente.

Dartdart
// Stream reattivo dei conteggi dei non letti (per un badge).
Respondo.unreadCountStream.listen((n) => setBadge(n));

// Oppure un setter di callback.
Respondo.onUnreadChanged = (n) => setBadge(n);

// Intercetta link/CTA; restituisci true se l'host ha aperto l'URL da solo.
Respondo.onUrlRequested = (url) {
  openInAppBrowser(url);
  return true;
};

Tracciamento delle schermate#

Segnala la schermata corrente a ogni navigazione, così i teaser proattivi e il targeting a livello di pagina possono farvi riferimento. Passa null per cancellarla; a ogni cambio il teaser proattivo viene rivalutato per la nuova schermata.

Dartdart
Respondo.setCurrentScreen('pricing');

Prossimi passi#

Aggiungi le Notifiche push e la Verifica dell’identità. L’intera superficie delle API, le superfici di engagement e la risoluzione dei problemi sono trattate nella guida introduttiva del Flutter SDK sulla pagina del package su pub.dev.