[英]Flutter swipe back gesture using nested navigators
我有一個推送其他子導航器的主導航器,但是如果我從子導航器推送一條路線,在 iOS 上,當我從打開的小部件滑回時,它會返回到主導航器根目錄,而不是 go 到子小部件的根目錄,那么我如何才能首先使用滑動手勢處理子導航器的歷史記錄,並且僅當我位於子導航器的根目錄(如單個導航器)時才允許 go 回到主導航器?
這是主要的導航器:
class MenuNavigator extends StatelessWidget {
final GlobalKey<NavigatorState> navigatorKey;
const MenuNavigator({Key key, this.navigatorKey}) : super(key: key);
WidgetBuilder routeBuilder(
RouteSettings routeSettings, GetUserResponse userResponse) {
switch (routeSettings.name) {
case MenuNavigatorRoutes.root:
return (context) => MenuPage();
case MenuNavigatorRoutes.documents:
return (context) => DocumentsNavigator();
case MenuNavigatorRoutes.requests:
return (context) => RequestsNavigator();
default:
return null;
}
}
@override
Widget build(BuildContext context) {
return Navigator(
key: navigatorKey,
initialRoute: MenuNavigatorRoutes.root,
onGenerateRoute: (routeSettings) {
return MaterialPageRoute(
settings: routeSettings,
builder: (context) =>
routeBuilder(routeSettings, userResponse)(context));
},
);
}
}
DocumentsNavigator 和 RequestsNavigator 是子導航器,具有與 MenuNavigator 相同的結構,但處理其他路由。
我剛剛發現,如果您將嵌套導航器包裝為:
WillPopScope(
child: NestedNavigator(initialRoute: ...),
onWillPop: () async =>
!Navigator.of(context).userGestureInProgress));
有用!
這對我有用。 WillPopScope 僅在嵌套導航器中超過 1 頁時添加。
@override
Widget build(BuildContext context) {
return NestedNavigator(
navigator: Navigator(
key: navigatorKey,
onPopPage: _handlePopPage,
pages: [],
),
);
}
import 'package:flutter/widgets.dart';
class NestedNavigator extends StatelessWidget {
const NestedNavigator({
super.key,
required this.navigator,
});
final Navigator navigator;
@override
Widget build(BuildContext context) {
if (navigator.pages.length > 1) {
return WillPopScope(
onWillPop: () async => !Navigator.of(context).userGestureInProgress,
child: navigator,
);
}
return navigator;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.