Skip to content

Flutter SDK

Official Flutter SDK for cross-platform mobile apps (iOS + Android).

  • Flutter 3.0+
  • Dart 2.17+

Add to your pubspec.yaml:

dependencies:
uchara_sdk: ^1.0.0

Then run:

Terminal window
flutter pub get
import 'package:flutter/material.dart';
import 'package:uchara_sdk/uchara_sdk.dart';
class ChatPage extends StatefulWidget {
@override
State<ChatPage> createState() => _ChatPageState();
}
class _ChatPageState extends State<ChatPage> {
late VisitorSDK visitor;
final List<Message> messages = [];
final TextEditingController _input = TextEditingController();
@override
void initState() {
super.initState();
visitor = VisitorSDK(VisitorConfig(
apiUrl: 'https://api.uchara.com',
widgetToken: 'wgt_your_token',
));
_initChat();
}
Future<void> _initChat() async {
await visitor.init();
// Listen to real-time events
visitor.events?.listen((event) {
if (event is MessageNewEvent) {
setState(() => messages.add(event.message));
}
});
// Get or start conversation
final conv = await visitor.getActiveConversation()
?? await visitor.startConversation(message: 'Hello!');
final loaded = await visitor.getMessages(conv.id);
setState(() {
messages.clear();
messages.addAll(loaded);
});
}
Future<void> _send() async {
final convId = visitor.activeConversationId;
if (convId == null || _input.text.isEmpty) return;
final msg = await visitor.sendMessage(
convId,
content: _input.text,
);
setState(() => messages.add(msg));
_input.clear();
}
@override
void dispose() {
visitor.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Chat Support')),
body: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: messages.length,
itemBuilder: (_, i) => ListTile(
title: Text(messages[i].content ?? ''),
subtitle: Text(messages[i].senderType),
),
),
),
Row(
children: [
Expanded(child: TextField(controller: _input)),
IconButton(icon: const Icon(Icons.send), onPressed: _send),
],
),
],
),
);
}
}