push<T> static method
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;
}