From 5f4b3a8d4e7fbb94c875e589a1537ac6f9135be2 Mon Sep 17 00:00:00 2001
From: "yangwu.jia" <yangwu.jia@taobao.com>
Date: Mon, 13 Jan 2020 21:23:06 +0800
Subject: [PATCH] NavObserver bugfixed

---
 example/lib/main.dart                | 20 +++++++++++
 lib/container/boost_container.dart   | 42 ++++++++---------------
 lib/container/container_manager.dart | 51 ----------------------------
 lib/flutter_boost.dart               |  4 +--
 4 files changed, 36 insertions(+), 81 deletions(-)

diff --git a/example/lib/main.dart b/example/lib/main.dart
index 22058b4..c835017 100755
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -29,6 +29,7 @@ class _MyAppState extends State<MyApp> {
         return FlutterRouteWidget(params:params);
       },
     });
+    FlutterBoost.singleton.addBoostNavigatorObserver(TestBoostNavigatorObserver());
   }
 
   @override
@@ -45,3 +46,22 @@ class _MyAppState extends State<MyApp> {
       String pageName, String uniqueId, Map params, Route route, Future _) {
   }
 }
+class TestBoostNavigatorObserver extends NavigatorObserver{
+  void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
+
+    print("flutterboost#didPush");
+  }
+
+  void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
+    print("flutterboost#didPop");
+  }
+
+  void didRemove(Route<dynamic> route, Route<dynamic> previousRoute) {
+    print("flutterboost#didRemove");
+  }
+
+  void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {
+    print("flutterboost#didReplace");
+  }
+}
+
diff --git a/lib/container/boost_container.dart b/lib/container/boost_container.dart
index b980572..56917b5 100755
--- a/lib/container/boost_container.dart
+++ b/lib/container/boost_container.dart
@@ -155,14 +155,11 @@ class BoostContainerState extends NavigatorState {
   @override
   void didUpdateWidget(Navigator oldWidget) {
     super.didUpdateWidget(oldWidget);
-    findContainerNavigatorObserver(oldWidget)?.removeBoostNavigatorObserver(
-        FlutterBoost.containerManager.navigatorObserver);
+
   }
 
   @override
   void dispose() {
-    findContainerNavigatorObserver(widget)?.removeBoostNavigatorObserver(
-        FlutterBoost.containerManager.navigatorObserver);
     routerHistory.clear();
     super.dispose();
   }
@@ -261,63 +258,52 @@ class ContainerElement extends StatefulElement {
 }
 
 class ContainerNavigatorObserver extends NavigatorObserver {
-  BoostNavigatorObserver observer;
 
-  final Set<BoostNavigatorObserver> _boostObservers =
-      Set<BoostNavigatorObserver>();
+  static final Set<NavigatorObserver> boostObservers =
+      Set<NavigatorObserver>();
 
   ContainerNavigatorObserver();
 
+
   factory ContainerNavigatorObserver.bindContainerManager() =>
-      ContainerNavigatorObserver()
-        ..addBoostNavigatorObserver(
-            FlutterBoost.containerManager.navigatorObserver);
+      ContainerNavigatorObserver();
 
-  VoidCallback addBoostNavigatorObserver(BoostNavigatorObserver observer) {
-    _boostObservers.add(observer);
+  VoidCallback addBoostNavigatorObserver(NavigatorObserver observer) {
+    boostObservers.add(observer);
 
-    return () => _boostObservers.remove(observer);
+    return () => boostObservers.remove(observer);
   }
 
-  void removeBoostNavigatorObserver(BoostNavigatorObserver observer) {
-    _boostObservers.remove(observer);
+  void removeBoostNavigatorObserver(NavigatorObserver observer) {
+    boostObservers.remove(observer);
   }
 
   @override
   void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
-    for (BoostNavigatorObserver observer in _boostObservers) {
+    for (NavigatorObserver observer in boostObservers) {
       observer.didPush(route, previousRoute);
     }
   }
 
   @override
   void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
-    for (BoostNavigatorObserver observer in _boostObservers) {
+    for (NavigatorObserver observer in boostObservers) {
       observer.didPop(route, previousRoute);
     }
   }
 
   @override
   void didRemove(Route<dynamic> route, Route<dynamic> previousRoute) {
-    for (BoostNavigatorObserver observer in _boostObservers) {
+    for (NavigatorObserver observer in boostObservers) {
       observer.didRemove(route, previousRoute);
     }
   }
 
   @override
   void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {
-    for (BoostNavigatorObserver observer in _boostObservers) {
+    for (NavigatorObserver observer in boostObservers) {
       observer.didReplace(newRoute: newRoute, oldRoute: oldRoute);
     }
   }
 }
 
-class BoostNavigatorObserver {
-  void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {}
-
-  void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {}
-
-  void didRemove(Route<dynamic> route, Route<dynamic> previousRoute) {}
-
-  void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {}
-}
diff --git a/lib/container/container_manager.dart b/lib/container/container_manager.dart
index 07147e6..25d78ae 100755
--- a/lib/container/container_manager.dart
+++ b/lib/container/container_manager.dart
@@ -62,8 +62,6 @@ class BoostContainerManager extends StatefulWidget {
 class ContainerManagerState extends State<BoostContainerManager> {
   final GlobalKey<OverlayState> _overlayKey = GlobalKey<OverlayState>();
   final List<BoostContainer> _offstage = <BoostContainer>[];
-  final ManagerNavigatorObserver _navigatorObserver =
-      ManagerNavigatorObserver();
 
   List<_ContainerOverlayEntry> _leastEntries;
 
@@ -78,7 +76,6 @@ class ContainerManagerState extends State<BoostContainerManager> {
 
   bool get foreground => _foreground;
 
-  ManagerNavigatorObserver get navigatorObserver => _navigatorObserver;
 
   //Number of containers.
   int get containerCounts => _offstage.length;
@@ -347,51 +344,3 @@ class _ContainerOverlayEntry extends OverlayEntry {
   }
 }
 
-class ManagerNavigatorObserver extends BoostNavigatorObserver {
-  BoostNavigatorObserver observer;
-
-  final Set<BoostNavigatorObserver> _boostObservers =
-      Set<BoostNavigatorObserver>();
-
-  VoidCallback addBoostNavigatorObserver(BoostNavigatorObserver observer) {
-    _boostObservers.add(observer);
-
-    return () => _boostObservers.remove(observer);
-  }
-
-  void removeBoostNavigatorObserver(BoostNavigatorObserver observer) {
-    _boostObservers.remove(observer);
-  }
-
-  @override
-  void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
-    Logger.log('ManagerNavigatorObserver didPush');
-    for (BoostNavigatorObserver observer in _boostObservers) {
-      observer.didPush(route, previousRoute);
-    }
-  }
-
-  @override
-  void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
-    Logger.log('ManagerNavigatorObserver didPop');
-    for (BoostNavigatorObserver observer in _boostObservers) {
-      observer.didPop(route, previousRoute);
-    }
-  }
-
-  @override
-  void didRemove(Route<dynamic> route, Route<dynamic> previousRoute) {
-    Logger.log('ManagerNavigatorObserver didRemove');
-    for (BoostNavigatorObserver observer in _boostObservers) {
-      observer.didRemove(route, previousRoute);
-    }
-  }
-
-  @override
-  void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {
-    Logger.log('ManagerNavigatorObserver didReplace');
-    for (BoostNavigatorObserver observer in _boostObservers) {
-      observer.didReplace(newRoute: newRoute, oldRoute: oldRoute);
-    }
-  }
-}
diff --git a/lib/flutter_boost.dart b/lib/flutter_boost.dart
index e9093da..b2d1138 100755
--- a/lib/flutter_boost.dart
+++ b/lib/flutter_boost.dart
@@ -189,8 +189,8 @@ class FlutterBoost {
       _observersHolder.addObserver<BoostContainerLifeCycleObserver>(observer);
 
   ///register callbacks for Navigators push & pop
-  VoidCallback addBoostNavigatorObserver(BoostNavigatorObserver observer) =>
-      _observersHolder.addObserver<BoostNavigatorObserver>(observer);
+  void addBoostNavigatorObserver(NavigatorObserver observer) =>
+      ContainerNavigatorObserver.boostObservers.add(observer);
 
 
 }
-- 
2.26.2