show method

void show(
  1. BuildContext context,
  2. DialogWidget dialog, {
  3. bool rootOverlay = true,
  4. int? id,
  5. bool hidePrevious = true,
})

Implementation

void show(BuildContext context, DialogWidget dialog, {bool rootOverlay = true, int? id, bool hidePrevious = true}) {
  if (hidePrevious || id == null) hideImmediate(context);

  OverlayState? overlayState = rootOverlay
    ? context.findRootAncestorStateOfType<OverlayState>()
    : context.findAncestorStateOfType<OverlayState>();

  if (dialog.closable) {
    _currentCallback.add(
      IndexedData<Future<bool> Function()>(
        id: id,
        data: () {
          hide(context, id: id);
          return Future.value(false);
        })
    );

  } else {
    _currentCallback.add(
      IndexedData<Future<bool> Function()>(
        id: id,
        data: () => Future.value(true)
      )
    );
  }

  if (_currentCallback.length == 1) {
    ModalRoute.of(context)?.addScopedWillPopCallback(onWillPop);
  }

  final StreamController<double> controller = StreamController();

  final OverlayEntry overlayEntry = OverlayEntry(
    builder: (_) => AppearWidget(
      child: Stack(
        children: <Widget>[
          GestureDetector(
            onTap: () => dialog.closable ? hide(context) : (){},
            child: Container(
              color: BACKGROUND_COLOR,
            ),
          ),
          dialog
        ],
      ),
      progress: controller.stream,
      duration: DEFAULT_DURATION,
      style: AppearStyle.opacity,
    ),
  );

  _currentController.add(
    IndexedData<StreamController<double>>(
      id: id,
      data: controller
    )
  );

  _currentOverlay.add(
    IndexedData<OverlayEntry>(
      id: id,
      data: overlayEntry
    )
  );

  overlayState?.insert(overlayEntry);
  controller.add(1.0);
}