ringg_flutter 0.1.1
ringg_flutter: ^0.1.1 copied to clipboard
Ringg AI widget for Flutter — drop-in widget and headless controller for voice/text AI agents.
ringg_flutter #
Embeddable chat + voice-call widget for Ringg AI agents — the Flutter implementation. Text chat, Meet-style voice calls, interactive components (forms, calendars, quick replies, Block Kit) and a post-call feedback screen, all driven by a headless core you can also use without the bundled UI.
Install #
dependencies:
ringg_flutter: ^0.1.0
Quick start #
import 'package:ringg_flutter/ringg_flutter.dart';
final livekit = createLiveKitTransport();
final controller = RinggWidgetController(
const RinggWidgetConfig(agentId: 'your-agent-id', xApiKey: 'your-api-key'),
ControllerPorts(
transport: livekit.transport,
urlResolver: const StaticUrlResolver({/* your environment URLs */}),
),
);
// Mount it over your app's content:
Stack(children: [
const YourApp(),
RinggWidget(controller: controller, transport: livekit),
]);
Dispose with controller.destroy() and livekit.dispose().
Platform setup (required for voice) #
iOS — ios/Runner/Info.plist:
<key>NSMicrophoneUsageDescription</key>
<string>Voice calls use the microphone.</string>
<key>UIBackgroundModes</key>
<array><string>audio</string></array>
Android — android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
Known issue — iOS 26.x simulators have NO working call audio #
On iOS 26.x simulator runtimes the audio engine has neither a working input (mic) nor output (playout) device — calls connect and transcripts stream, but you will not hear the agent or be able to unmute. This is an Apple simulator defect + upstream LiveKit limitation, not fixable app-side: client-sdk-swift#795, #849, Apple forums 738346, 803364. The widget degrades gracefully (listen-only attempt, no error). Test voice on a real device, an Android emulator, or macOS.
Headless use #
Skip RinggWidget and consume the stores directly — every piece of state is a
Store<T> with snapshot + subscribe:
controller.messages.subscribe((snap) => print(snap.messages.length));
await controller.startCall(MediaType.text);
await controller.sendMessage('Hello!');
Example #
A full dev harness lives in example/ — offline mock mode by default, real
backend via --dart-define-from-file. See example/README.md.