The official Flutter SDK for embedding interactive SeatLayer reserved-seating maps on iOS and Android. It includes selection, holds, best available, general admission, floors, accessibility controls, and a typed event bridge.
Package on pub.dev · Developer docs · Live demo · Website · Native Android · React Native · AI Toolkit
Public preview:
0.2.xis the current public Flutter line. Validate it with a test event and physical iOS/Android devices before production rollout.
flutter pub add seatlayerOr add it to pubspec.yaml:
dependencies:
seatlayer: ^0.2.0Then import the public library:
import 'package:seatlayer/seatlayer.dart';Create one controller for the lifetime of the view. Give the map a definite height or place it full-screen.
final controller = SeatLayerController();
@override
Widget build(BuildContext context) {
return SizedBox(
height: 640,
child: SeatLayerView(
controller: controller,
configuration: SeatLayerConfiguration(
event: 'ev_your_event_key',
currency: 'USD',
),
onReady: (info) {
debugPrint(
'SeatLayer ready: protocol=${info.protocolRevision} '
'mode=${info.mode.raw}',
);
},
),
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}Drive buyer actions through the controller:
try {
final hold = await controller.bestAvailable(4);
if (hold != null) {
beginCheckoutOnYourServer(hold.holdId);
}
} on SeatLayerError catch (error) {
// Handle sold_out, not_enough_together, expired holds, and other
// recoverable inventory outcomes in the buyer UI.
showSeatError(error.code, error.message);
}Subscribe to strongly typed event streams:
controller.onSelectionChanged.listen(updateSelectedSeats);
controller.onHold.listen(persistHold);
controller.onHoldExpired.listen(returnBuyerToMap);
controller.onError.listen(reportSeatLayerError);For private channel inventory, mint short-lived sessions on your backend for
the exact allowed origin https://cdn.seatlayer.io:
final configuration = SeatLayerConfiguration(
event: 'ev_private',
buyerAccessTokenProvider: (context) =>
buyerBackend.mintSeatLayerAccess(context.reason),
);The Flutter app selects and holds inventory. Your trusted backend inspects and books the hold after payment or order validation.
- Never ship a SeatLayer secret key in the app binary or WebView.
- Send only the
holdIdand your normal checkout context to your backend. - Calculate the charge from server-inspected hold items, not app input.
- Reuse your stable order id as
bookingReffor safe booking retries.
Read how the integration works before connecting checkout.
Production views load the immutable
seatlayer-js@0.66.0/mobile.html document and its lazy assets from
https://cdn.seatlayer.io inside webview_flutter. This gives iOS and Android
one canonical HTTPS origin for origin-bound buyer sessions. Tokens stay in
memory and are never put in page URLs or events. Explicit bundled fixture pages
remain supported for demos and tests and are pinned separately to 0.59.0.
The public contract matches the Web and iOS SDKs:
- commands return
Futurevalues and throw typedSeatLayerErrorfailures; - events arrive through typed Dart streams;
- protocol negotiation fails clearly when an app update is required; and
- unknown future enum values and events remain forward-compatible.
hold · resumeHold · extendHold · release · releaseLabels ·
bestAvailable · holdGA · setSeatTier · getSelection ·
selectObjects · deselectObjects · clearSelection · selectCategories ·
deselectCategories · setSelectableObjects · setMaxSelection ·
getSelectionValidity · refreshAccess · getCurrentHold · getGAAreas ·
getFloors · setFloor · setColorblindSafe · setViewMode ·
getViewMode · zoomIn · zoomOut · zoomToFit · destroy
onReady · onSelectionChanged · onSelectionValidityChanged ·
onSelectionValid · onSelectionInvalid · onSelectionLimit ·
onBuyerAccessExpired · onBuyerAccessUnavailable ·
onSelectedObjectsUnavailable · onHold · onHoldRestored · onHoldExpired ·
onError · onHint · onGAClick · onSeatHover · onDeckTap ·
onUnknownEvent
Do not place the seat map inside ListView, SingleChildScrollView, or another
gesture-driven scrolling surface. The canvas owns pan and pinch gestures for map
navigation. Use a fixed-height SizedBox, an Expanded child with a resolved
height, or a full-screen route.
cd example
flutter runThe example uses the SDK's offline fixture to exercise the real bridge and renderer without a live event key. For an end-to-end integration, provide a test event and keep the default API origin.
- Mobile SDK guide
- Buyer SDK installation
- Holds and checkout
- Complete checkout example
- JavaScript and React SDKs
- SeatLayer iOS SDK
- Agent-readable documentation
| Surface | Package or source |
|---|---|
| JavaScript | @seatlayer/js |
| React | @seatlayer/react |
| React Native | @seatlayer/react-native |
| iOS | seatlayer-ios |
| Android | seatlayer-android |
| Server SDKs | Node.js, Python, PHP, Ruby, .NET, Java, and Go |
flutter pub get
flutter analyze
flutter test
dart pub publish --dry-runMIT © SeatLayer