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.

4platform lines

Android, iOS, Flutter, and React Native remain distinct release and lifecycle boundaries.

5capabilities

Place search, nearby, directions, geofence, and feedback are evaluated independently.

20platform paths

Every pairing is represented, including gaps in the current first-party overview.

17published paths

The remaining 3 paths require product selection—not a guessed package.

Bind to the runtime you own

Versions were checked against the linked first-party overview on 2026-08-17. Reconfirm before resolving dependencies.

selection-required

Feedback UI for React Native

Documentation
v2.0.0
Component
Not listed in current overview
Version
Selection required
State model
draft

The current React Native v2.0.0 overview does not list Feedback UI. This is a selection-required gap, not evidence that the capability is impossible or that another platform package is compatible.

Open first-party evidence Read as JSON

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.

01
Application screen

idle

No provider controller, route, Promise, delegate, or listener is active.

02
Platform adapter

launching

One generation ID binds configuration, owner, and launch time.

03
Provider widget under host lifecycle

active

Background, recreation, close, and duplicate-launch behavior are observable.

04
Platform adapter

returned / cancelled / failed

Exactly one typed terminal result wins; late results are ignored.

05
Application domain

candidate

Validate and normalize application feedback draft and attributable submission/reconciliation identity before committing.

06
Application repository

committed

Persist the normalized selection/draft with version, actor, source, and audit event.

React Native host adapter boundary
type PlaceSelection = { version: 1; mapplsPin: string; label: string };

interface MapplsPlaceWidget {
  selectPlace(): Promise<unknown>;
}

async function choose(widget: MapplsPlaceWidget, generation: number) {
  const value = await widget.selectPlace();
  if (!isFocused() || generation !== currentGeneration()) return;
  if (!isPlaceSelection(value)) throw new Error("invalid_widget_result");
  commitCandidate(value); // Store normalized data, never the opaque native object.
}

function isPlaceSelection(value: unknown): value is PlaceSelection {
  const item = value as Partial<PlaceSelection> | null;
  return item?.version === 1 && /^[A-Za-z0-9]{6}$/.test(item.mapplsPin ?? "") && typeof item.label === "string";
}

The widget is a collaborator, not your database.

One focused screen owns the native Promise, bridge generation, AppState changes, cancellation, and normalized JavaScript result.

Parse unknown bridge data into a versioned TypeScript value; do not store an opaque native result object.

Promise rejection, native cancellation, screen blur/unmount, bridge reload, and malformed data are typed separately.

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.

01

Public repository and developer-documentation version drift is resolved before dependency pinning

02

Peer native SDK versions are compatible

03

Only the focused mounted screen accepts a Promise result

04

Bridge data is schema-validated

05

Fast Refresh and native recreation do not double-commit

06

Permission/configuration denied

07

Offline and slow provider response

08

Cancel before and after a candidate appears

09

Host edit invalidates a stale selection

10

Duplicate callback/Promise result commits once

11

Accessibility, focus return, and a non-widget fallback