show static method

Future<bool> show({
  1. required List<CNSheetPage> pages,
  2. List<CNSheetDetent> detents = const [CNSheetDetent.medium, CNSheetDetent.large],
  3. CNSheetDetent? initialDetent,
  4. CNSheetDetent? undimmedDetent,
  5. bool dismissible = true,
  6. bool showGrabber = true,
  7. int selectedPage = 0,
  8. Color? tintColor,
  9. bool? isDark,
  10. void onDetentChanged(
    1. CNSheetDetent detent
    )?,
  11. void onPageSelected(
    1. int page
    )?,
  12. void onItemTap(
    1. int page,
    2. int index
    )?,
  13. void onButtonTap(
    1. int page,
    2. String id
    )?,
  14. VoidCallback? onDismissed,
})

Presents the sheet with pages.

detents are the heights the sheet rests at, and initialDetent the one it opens at (the first by default). Up to and including undimmedDetent, the app behind the sheet is not dimmed and stays interactive; null dims it at every height. dismissible false keeps the sheet from being dragged closed. isDark sets the sheet's appearance; null follows the system.

Returns whether the sheet was shown.

Implementation

static Future<bool> show({
  required List<CNSheetPage> pages,
  List<CNSheetDetent> detents = const [
    CNSheetDetent.medium,
    CNSheetDetent.large,
  ],
  CNSheetDetent? initialDetent,
  CNSheetDetent? undimmedDetent,
  bool dismissible = true,
  bool showGrabber = true,
  int selectedPage = 0,
  Color? tintColor,
  bool? isDark,
  void Function(CNSheetDetent detent)? onDetentChanged,
  void Function(int page)? onPageSelected,
  void Function(int page, int index)? onItemTap,
  void Function(int page, String id)? onButtonTap,
  VoidCallback? onDismissed,
}) async {
  assert(pages.isNotEmpty && detents.isNotEmpty);
  assert(initialDetent == null || detents.contains(initialDetent));
  assert(undimmedDetent == null || detents.contains(undimmedDetent));
  if (kIsWeb ||
      (defaultTargetPlatform != TargetPlatform.iOS &&
          defaultTargetPlatform != TargetPlatform.macOS)) {
    return false;
  }

  _detents = List.unmodifiable(detents);
  _onDetentChanged = onDetentChanged;
  _onPageSelected = onPageSelected;
  _onItemTap = onItemTap;
  _onButtonTap = onButtonTap;
  _onDismissed = onDismissed;
  _channel.setMethodCallHandler(_handle);

  final shown = await _channel.invokeMethod<bool>('show', {
    'pages': [for (final p in pages) _pageMap(p)],
    'detents': [for (final d in detents) d._toMap()],
    'initialDetent': initialDetent == null
        ? 0
        : detents.indexOf(initialDetent),
    if (undimmedDetent != null)
      'undimmedDetent': detents.indexOf(undimmedDetent),
    'dismissible': dismissible,
    'showGrabber': showGrabber,
    'selectedPage': selectedPage,
    if (tintColor != null) 'tint': tintColor.toARGB32(),
    if (isDark != null) 'isDark': isDark,
  });
  _shown = shown ?? false;
  if (!_shown) _reset();
  return _shown;
}