Skip to main content
Once the widget is mounted, the controller is your handle on it: subscribe to what the conversation is doing, drive the panel from your own UI, and react to actions the assistant fires.

Lifecycle events

The widget emits five lifecycle events. The names and payloads are identical on every platform; only the delivery mechanism differs (browser CustomEvent on the web, an in-memory bus on React Native and Flutter).
ringg:calendar_booking and ringg:component_acknowledgement only fire when the assistant sends interactive components. An assistant configured for plain voice or text never emits them.
Flutter has no DOM, so events arrive on the controller’s in-memory bus. on returns an unsubscribe function; call it in dispose.
Payloads arrive as maps keyed by the field names in the table above.

Controller methods

Call these to drive the widget from your own buttons, routes or deep links.
The controller also exposes methods for component responses, Block Kit actions and local components. The bundled widget calls those on itself while rendering interactive components, so a normal integration does not need them.

Reading state

Each store publishes immutable snapshots. StoreBuilder is the subscription primitive: it subscribes on mount, rebuilds on every new snapshot, and unsubscribes on dispose.
Each message carries name, message, isSelf, timestamp, an optional sourceUrl for retrieved sources, and a component type with its data when the message renders a component instead of text. RinggScope carries the controller down the tree if you would rather read it from context than pass it explicitly.

Interactive components

Assistants can send interactive components into the chat thread instead of plain text. All six types render natively, with no work on your side beyond mounting the widget. Configure which components an assistant can send from the dashboard. See Chat Components for authoring them.

Agent-triggered app actions

Assistants can fire host actions during a conversation, for example to open a route or prefill a field. On the web these become browser events. Flutter has no ambient event bus, so you supply a handler on the ports and receive the same payload.
Leave it unset and actions are acknowledged and dropped. Set eventLogs: EventLogsConfig(enabled: true) in config to also show each fired action as an inline pill in the chat thread.

Ports reference

The second argument to RinggWidgetController wires the widget to your app’s capabilities. Only transport is required.
The default microphone port reports granted and lets the platform prompt when the audio track is created, which is why the manifest and Info.plist entries in platform setup are what actually gate voice. Supply your own micPermission if you want to request access earlier, or show your own explanation first.

QA checklist

Open and close the panel once, then confirm one ringg:widget_status event per action.
Start and end one conversation, then confirm ringg:conversation_status carries a callId.
Confirm every eventBus.on subscription is released in dispose.
Submit and skip feedback in separate runs if the feedback screen is enabled.
Confirm destroy() and dispose() run and the microphone indicator clears.