我正在try 使用导航器中间件

以下是我的Main.DART代码:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
      .then((value) => runApp(const MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: Strings.appTitle,
      theme: AppTheme().light(),
      initialRoute: NavigationManager.returnNavigationRoute(),
      onGenerateRoute: RouteGenerator.generateRoute,
      navigatorObservers: [RouteManager.routeObserver, RouteManager.middleware],
    );
  }
}

和我的路由管理器类:

class RouteManager {
  static final RouteObserver<PageRoute> routeObserver =
      RouteObserver<PageRoute>();

  static final NavigatorMiddleware<PageRoute> middleware =
      NavigatorMiddleware<PageRoute>(
    onPush: (route, previousRoute) {
      log('we have push event');
    },
  );
}

我身边的一切似乎都很好.跟随这tutorial个人

新增导航器MiddleWare代码:NavigationMiddleWare

推荐答案

将您的中间件代码替换为以下代码:

import 'dart:developer'; 
 import 'package:flutter/material.dart'; 
  
 typedef OnRouteChange<R extends Route<dynamic>> = void Function(R route, R? previousRoute); 
  
 class NavigatorMiddleware<R extends Route<dynamic>> extends RouteObserver<R> { 
   NavigatorMiddleware({ 
     this.enableLogger = true, 
     this.onPush, 
     this.onPop, 
     this.onReplace, 
     this.onRemove, 
   }) : _stack = []; 
  
   final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); 
   final List<R> _stack; 
   final bool enableLogger; 
   final OnRouteChange<R>? onPush; 
   final OnRouteChange<R>? onPop; 
   final OnRouteChange<R>? onReplace; 
   final OnRouteChange<R>? onRemove; 
  
   List<R> get stack => List<R>.from(_stack); 
  
   @override 
   void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) { 
     _logger('{didPush} \n route: $route \n previousRoute: $previousRoute'); 
     _stack.add(route as R); 
     _logStack(); 
     if (onPush != null) { 
       onPush!(route, previousRoute as R?); 
     } 
     super.didPush(route, previousRoute); 
   } 
  
   @override 
   void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) { 
     _logger('{didPop} \n route: $route \n previousRoute: $previousRoute'); 
     _stack.remove(route); 
     _logStack(); 
     if (onPop != null) { 
       onPop!(route as R, previousRoute as R?); 
     } 
     super.didPop(route, previousRoute); 
   } 
  
   @override 
   void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) { 
     _logger('{didReplace} \n newRoute: $newRoute \n oldRoute: $oldRoute'); 
     if (_stack.contains(oldRoute)) { 
       final oldItemIndex = _stack.indexOf(oldRoute as R); 
       _stack[oldItemIndex] = newRoute as R; 
     } 
     _logStack(); 
     if (onReplace != null) { 
       onReplace!(newRoute as R, oldRoute as R?); 
     } 
     super.didReplace(newRoute: newRoute, oldRoute: oldRoute); 
   } 
  
   @override 
   void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) { 
     _logger('{didRemove} \n route: $route \n previousRoute: $previousRoute'); 
     stack.remove(route); 
     _logStack(); 
     if (onRemove != null) { 
       onRemove!(route as R, previousRoute as R?); 
     } 
     super.didRemove(route, previousRoute); 
   } 
  
   @override 
   void didStartUserGesture(Route<dynamic> route, Route<dynamic>? previousRoute) { 
     _logger('{didStartUserGesture} \n route: $route \n previousRoute: $previousRoute'); 
     super.didStartUserGesture(route, previousRoute); 
   } 
  
   @override 
   void didStopUserGesture() { 
     _logger('{didStopUserGesture}'); 
     super.didStopUserGesture(); 
   } 
  
   void _logStack() { 
     final mappedStack = 
     _stack.map((Route route) => route.settings.name).toList(); 
  
     _logger('Navigator stack: $mappedStack'); 
   } 
  
   void _logger(String content) { 
     if (enableLogger) { 
       log(content); 
     } 
   } 
 }

希望能有所帮助

Flutter相关问答推荐

Android元数据为1.9.0,预期版本为1.7.1,如何解决flutter应用程序构建失败问题?

如何在不使用NULL-check(!)的情况下缩小`FutureBuilder.Builder()`内部的`Snaphot`范围

底部导航栏项目在抖动中不更改 colored颜色

CLI数据库连接后将SHA-1密钥添加到Firebase项目

Flutter 翼doctor 显示的错误,我似乎不能修复.问题:系统32、Android工具链、Windows 10 SDK

Android Studio中的Ffltter&;Couchbase:进程C:/Program Files/Git/bin/bash以非零退出值35结束

如何组合匹配器

Flutter 隔离.使用多个参数运行

我想在Flutter中画一个箭头,但我似乎无法填满空间

在 flutter 吧蜂巢中拯救主题

播放特定持续时间Flutter 的音频

如何在点击查看措辞下方添加句子?

如何在 Flutter 中创建厚度沿着容器逐渐减小的边框

如何在列表视图生成器中显示图像

Flutter 中的区域不匹配

升级到 Flutter 3.10 后,Flutter 键盘填充不起作用. Flutter 3.10 如何防止 BottomSheet 被键盘覆盖?

如何在 Flutter (iOS) 中解决这个问题

Container 的 Flutter 背景图片不会出现

Flutter 中父容器顶部的 Gridview 间距额外区域

我的主屏幕上的 FutureBuilder 不断重新加载(但仅在其他屏幕上时)?