ringg_flutter drops the same chat and voice widget you embed on the web into a Flutter app: text chat, voice calls, interactive components (forms, calendars, quick replies, Block Kit) and the post-call feedback screen.
It is a full Dart implementation on livekit_client, with no platform bridge, mirroring the web widget’s behavior and UI.
Prerequisites
An active Ringg AI account with an assistant configured for Webcall.
The assistant
agentId and its webcall public key from the dashboard.Dart 3.6+, Flutter 3.27+.
Your app’s application id / bundle id added to the assistant’s allowed clients (see Caller identity).
Install
pubspec.yaml
flutter pub get.
Platform setup
Voice calls need microphone and audio permissions. Text chat works without them.- iOS
- Android
ios/Runner/Info.plist:Integrate
1
Get your credentials
From the Ringg AI dashboard you need the assistant’s agent id and its webcall public key, passed as
Bearer <key>. Endpoints are built in and default to production, so there are no URLs to configure.2
Wire up a controller and widget
Hold the transport and controller in a
State so you can dispose of them.3
Mount it over your app
RinggWidget places its own floating trigger and panel, so give it the full screen on top of your content.Caller identity
The backend allow-lists an assistant’s callers by theOrigin header. Browsers attach one automatically, which is how domain whitelisting works for the web widget. Native HTTP sends nothing, so a webcall request without a caller identity is refused before authentication is even considered.
Add the value to the assistant’s allowed clients under Agent → Webcall → Install & domains in the dashboard. Application ids differ per platform and per build flavor (
.debug, .staging, .dev), so every build you ship needs its own entry. The value that was sent appears in the refused-call response, ready to paste.
On Flutter this is handled for you. The package reads the running app’s id and sends <platform>://<bundleId>:
Set
clientOrigin in config only to pin one value across build flavors. See pinning the caller identity.
Configuration
RinggWidgetConfig has 27 fields covering panel copy, theming, buttons, the feedback screen, slash commands and voice-call view. Only agentId is required, and every null field falls back to a shared default.
Configuration reference
Every option, its type, and its default.
Events and control
The controller emits the same five lifecycle events as the web widget, exposes methods for driving the panel from your own UI, and lets you handle actions the assistant fires.Events and control reference
Lifecycle events, controller methods, state bindings, host actions and the ports table.
Platform support
Android, iOS, macOS, Windows and Linux. Web is not supported; use the web widget there.Example app
A runnable example ships in the package’s Example tab on pub.dev.Test checklist
flutter pub get resolves and the app builds on both platforms.The trigger appears above your app content.
Voice mode prompts for microphone permission and can start and end a call on a real device.
Every shipped flavor’s application id is in the assistant’s allowed clients.
_controller.destroy() and _transport.dispose() run in dispose(). Confirm the mic indicator clears.Known issues
- Breaking changes between releases. APIs may shift while pre-1.0; pin an exact version if you need stability.
- iOS simulators (26.x) have no call audio. The simulator exposes no microphone or playout device, so you will not hear the assistant or be able to unmute. This is an OS-simulator and upstream realtime-SDK limitation, not fixable app-side; the widget degrades to a listen-only attempt. Test voice on a real device, an Android emulator, or macOS. (Apple refs: forums 738346, 803364.)
- Voice on Android emulators can fail to connect. Emulator networking often cannot establish the media connection; text chat works, but voice needs a real device.