import 'dart:async';
import 'package:flutter/material.dart';
import 'package:kuralit_sdk/kuralit.dart';
class ChatScreen extends StatefulWidget {
const ChatScreen({super.key});
@override
State<ChatScreen> createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final TextEditingController _textController = TextEditingController();
final List<String> _messages = [];
bool _isConnected = false;
String? _sessionId;
StreamSubscription<KuralitEvent>? _eventSubscription;
@override
void initState() {
super.initState();
_initializeSDK();
}
void _initializeSDK() {
// Initialize SDK
Kuralit.init(KuralitConfig(
serverUrl: 'ws://localhost:8000/ws',
apiKey: 'demo-api-key',
appId: 'my-app',
debug: true,
));
// Generate session ID
_sessionId = Kuralit.generateSessionId();
// Listen to events
_eventSubscription = Kuralit.events.listen((event) {
if (event is KuralitConnectedEvent) {
setState(() => _isConnected = true);
} else if (event is KuralitServerTextEvent) {
setState(() => _messages.add('Agent: ${event.text}'));
}
});
// Connect
_connect();
}
Future<void> _connect() async {
try {
await Kuralit.connect();
} catch (e) {
print('Connection failed: $e');
}
}
void _sendMessage() {
final text = _textController.text.trim();
if (text.isEmpty || !_isConnected || _sessionId == null) return;
setState(() {
_messages.add('You: $text');
_textController.clear();
});
Kuralit.sendText(_sessionId!, text);
}
@override
void dispose() {
_eventSubscription?.cancel();
_textController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Chat with AI Voice Agent'),
actions: [
Icon(
_isConnected ? Icons.check_circle : Icons.cancel,
color: _isConnected ? Colors.green : Colors.red,
),
],
),
body: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: _messages.length,
itemBuilder: (context, index) {
return ListTile(title: Text(_messages[index]));
},
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: TextField(
controller: _textController,
decoration: const InputDecoration(
hintText: 'Type a message...',
),
onSubmitted: (_) => _sendMessage(),
),
),
IconButton(
icon: const Icon(Icons.send),
onPressed: _sendMessage,
),
],
),
),
],
),
);
}
}