Android, iOS, Flutter, and React Native remain distinct release and lifecycle boundaries.
One capability. Four runtimes. Six lifecycle states.
Choose the exact mobile path you are shipping. The matrix preserves current version evidence, exposes missing overview coverage, and makes the host application—not the provider UI—the owner of durable state.
Place search, nearby, directions, geofence, and feedback are evaluated independently.
Every pairing is represented, including gaps in the current first-party overview.
The remaining 3 paths require product selection—not a guessed package.
Feedback UI for Android
- Documentation
- v2.0.2
- Component
- Feedback UI
- Version
- 4.0.0
- State model
- draft
The current Android overview lists Feedback UI 4.0.0 under documentation v2.0.2. Confirm the exact package, configuration, callback schema, and entitlement in the selected guide before binding the adapter.
Twenty paths. Every gap visible.
“Not listed” means the current overview does not establish a package. It does not mean the capability is impossible, and it never licenses reuse of another platform’s package.
Make every return, cancellation, and late callback explainable.
The generated scaffold deliberately stops at an application-owned candidate. Your repository decides whether and how that candidate becomes durable.
idle
No provider controller, route, Promise, delegate, or listener is active.
launching
One generation ID binds configuration, owner, and launch time.
active
Background, recreation, close, and duplicate-launch behavior are observable.
returned / cancelled / failed
Exactly one typed terminal result wins; late results are ignored.
candidate
Validate and normalize application feedback draft and attributable submission/reconciliation identity before committing.
committed
Persist the normalized selection/draft with version, actor, source, and audit event.
data class PlaceSelection(val mapplsPin: String, val label: String)
interface MapplsPlaceWidget {
suspend fun selectPlace(): PlaceSelection? // null means deliberate cancellation
}
class AddressDraft(private val widget: MapplsPlaceWidget) {
suspend fun choose(): PlaceSelection? = widget.selectPlace()?.also { selected ->
require(Regex("^[A-Za-z0-9]{6}$").matches(selected.mapplsPin))
// Persist through the application repository, not a Fragment reference.
}
}The widget is a collaborator, not your database.
One Activity, Fragment, or Compose wrapper owns launch, callback registration, saved state, and disposal.
Translate the documented Activity/Fragment result into a small application selection before persisting it.
Back, close, process recreation, denied configuration, and an unavailable Activity are distinct outcomes.
The durable record is application feedback draft and attributable submission/reconciliation identity; never retain a provider view/controller or opaque bridge result.
Test the lifecycle you cannot demo.
Happy-path selection proves almost nothing about a production mobile integration.
BoM/component versions resolve together
Debug and release signing identities are separately approved
Rotation and process death do not duplicate a commit
Fragment/Activity listeners are removed with their owner
Permission/configuration denied
Offline and slow provider response
Cancel before and after a candidate appears
Host edit invalidates a stale selection
Duplicate callback/Promise result commits once
Accessibility, focus return, and a non-widget fallback