Dokumentasi

Flutter SDK

Klien Dart tulen untuk sembang sokongan Respondo — tiada kod platform asli yang perlu dikompil atau dinyahpepijat.

Keperluan#

  • Dart >=3.4.0 <4.0.0.
  • Flutter >=3.16.0 (barisan 3.x).
  • Dart tulen: tiada jambatan asli, tiada pod install, tiada suntingan Gradle. Kebergantungan transitif ialah pakej Dart biasa (http, web_socket_channel, uuid).

Pemasangan#

Tambah pakej ini daripada pub.dev:

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

Inisialisasi#

Ikat Respondo.navigatorKey pada MaterialApp anda supaya SDK dapat membuka helaian sembang tanpa BuildContext anda, panggil Respondo.init sekali sahaja, kemudian 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();

  // File storage directory comes from a host-app plugin; the SDK stays pure.
  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, // required so the SDK can open the chat
      home: Scaffold(
        body: Center(
          child: FilledButton(
            onPressed: () => Respondo.open(),
            child: const Text('Support'),
          ),
        ),
      ),
    );
  }
}

Semua kaedah fasad bersifat idempoten, selamat dipanggil sebelum init (ia menimbal lalu memainkannya semula), dan tidak pernah melontar ralat ke dalam aplikasi anda.

Mengenal pasti pengguna#

Secara lalai, setiap pelawat adalah tanpa nama. Pada pelancaran pertama, SDK menjana visitor_id yang stabil dan menyimpannya dalam storan tempatan, jadi pengguna yang kembali menemui semula perbualan mereka. Tiada kunci API yang perlu dibenamkan — setiap perbualan dilindungi oleh token sesi tersendiri yang dijana backend dan dilanjutkan pada setiap mesej, jadi pelawat tanpa nama tidak perlu mengesahkan dirinya semula.

Panggil identify sebaik pengguna anda log masuk. Ini melampirkan identiti sebenar mereka supaya sejarah mereka mengikut merentas peranti dan pemasangan semula, dan nama serta e-mel mereka terpapar di sebelah perbualan dalam peti masuk anda, bukan sekadar pelawat tanpa nama.

userHash ialah tandatangan yang dikira oleh backend anda daripada identity_secret ejen — HMAC-SHA256(secret, userId) (atau e-mel apabila tiada userId), dikodkan sebagai hex huruf kecil. Rahsia itulah yang membuktikan identiti tersebut tulen, jadi ia mesti kekal hanya pada backend anda dan tidak sekali-kali dihantar bersama aplikasi. Lihat halaman Pengesahan identiti untuk formula penuh dan contoh di sisi pelayan.

Dartdart
// 1. Sign in against your own backend and read the precomputed hash
//    (for example, a field returned alongside the login response).
final session = await api.login(email, password);

// 2. Hand the finished userHash to the SDK — never compute it in the app.
Respondo.identify(RespondoIdentity(
  userId: session.userId,
  email: session.email,
  name: session.fullName,
  userHash: session.respondoUserHash,
));

// 3. On logout: revoke the session and start a fresh anonymous visitor.
Respondo.reset();

Jika hash tiada atau salah, tiada ralat dilontar: backend senyap-senyap mengekalkan pelawat sebagai tanpa nama, sembang terus berfungsi, dan anda cuma kehilangan pautan merentas peranti sehingga hash yang sah dibekalkan. Pengesahan hanya berjalan apabila ejen mempunyai identity_secret yang ditetapkan — biarkan ia kosong semasa pembangunan dan userId / e-mel diterima seadanya.

Observable & panggilan balik#

Semuanya tersedia sebagai Stream siaran, penetap panggil balik, dan pengambil nilai semasa.

Dartdart
// Reactive stream of unread counts (for a badge).
Respondo.unreadCountStream.listen((n) => setBadge(n));

// Or a callback setter.
Respondo.onUnreadChanged = (n) => setBadge(n);

// Intercept links/CTAs; return true if the host opened the URL itself.
Respondo.onUrlRequested = (url) {
  openInAppBrowser(url);
  return true;
};

Penjejakan skrin#

Laporkan skrin semasa pada setiap navigasi supaya teguran proaktif dan penyasaran peringkat halaman boleh dipadankan dengannya. Hantar null untuk mengosongkannya; pada setiap perubahan, teguran proaktif dinilai semula untuk skrin baharu itu.

Dartdart
Respondo.setCurrentScreen('pricing');

Langkah seterusnya#

Tambah Pemberitahuan push dan Pengesahan identiti. Keseluruhan permukaan API, permukaan penglibatan dan penyelesaian masalah diterangkan dalam panduan permulaan SDK Flutter di halaman pakej pub.dev.