Lifecycle events
The widget emits five lifecycle events. The names and payloads are identical on every platform; only the delivery mechanism differs (browserCustomEvent 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.on returns an unsubscribe function; call it in dispose.
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.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 toRinggWidgetController 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.