簡體   English   中英

Flutter 使用嵌套導航器向后滑動手勢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM