push<T> static method

Future<T?> push<T>(
  1. BuildContext context,
  2. Widget child
)

The mobile layout drops a home page's navigator, pages and all, so a desktop page left open reopens in the mobile form while its opener stays.

Implementation

static Future<T?> push<T>(BuildContext context, Widget child) {
  final navigator = Navigator.of(context);
  if (context.isMobileView) {
    return navigator.push<T>(_routeOf(context, child));
  }
  final completer = Completer<T?>();
  var popped = false;
  void reopenIfDropped() {
    if (popped) {
      return;
    }
    WidgetsBinding.instance.addPostFrameCallback((_) {
      completer.complete(context.mounted ? push<T>(context, child) : null);
    });
  }

  final route = FadePageRoute<T>(
    builder: (_) => _DropWatch(onDropped: reopenIfDropped, child: child),
  );
  unawaited(
    navigator.push<T>(route).then((value) {
      popped = true;
      completer.complete(value);
    }),
  );
  return completer.future;
}