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.

source-ready

Place search and picker for Flutter

Documentation
v2.0.1
Component
Place Search Widget
Version
2.0.0
State model
selection

The current Flutter overview lists Place Search Widget 2.0.0 under documentation v2.0.1. Confirm the exact package, configuration, callback schema, and entitlement in the selected guide before binding the adapter.

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 mappls pin plus application-owned display label before committing.

06
Application repository

committed

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

Flutter host adapter boundary
final class PlaceSelection {
  const PlaceSelection(this.mapplsPin, this.label);
  final String mapplsPin;
  final String label;
}

abstract interface class MapplsPlaceWidget {
  Future<PlaceSelection?> selectPlace();
}

Future<void> choose(MapplsPlaceWidget widget) async {
  final generation = ++_launchGeneration;
  final selected = await widget.selectPlace();
  if (!mounted || generation != _launchGeneration || selected == null) return;
  if (!RegExp(r'^[A-Za-z0-9]{6}$').hasMatch(selected.mapplsPin)) throw const FormatException('invalid_mappls_pin');
  setState(() => _selected = selected); // Persist through the app repository on submit.
}

The widget is a collaborator, not your database.

One route/widget state owns the MethodChannel launch Future, mounted check, cancellation, and application commit.

Validate the returned platform value, Mappls Pin, and request generation before updating Dart state.

A null result, PlatformException, route disposal, background interruption, and user cancellation are not interchangeable.

The durable record is mappls pin plus application-owned display label; 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

Android and iOS plugin versions are resolved by one lockfile

02

Every awaited result checks mounted/generation

03

PlatformException is mapped to a typed UI state

04

A late result cannot update a disposed route

05

Permission/configuration denied

06

Offline and slow provider response

07

Cancel before and after a candidate appears

08

Host edit invalidates a stale selection

09

Duplicate callback/Promise result commits once

10

Accessibility, focus return, and a non-widget fallback