From 62f44a98bcac75937ede3082545f7ffcfe215e8c Mon Sep 17 00:00:00 2001 From: xuanwu <gzhongcheng@qq.com> Date: Thu, 6 Jun 2019 18:43:03 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0=E4=BA=86flutter?= =?UTF-8?q?=E4=B8=8EiOS=E5=8E=9F=E7=94=9F=E4=BE=A7=E6=BB=91=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E7=9A=84=E4=B8=80=E7=A7=8D=E8=A7=A3=E5=86=B3=E6=96=B9?= =?UTF-8?q?=E6=A1=88=EF=BC=9A=20=09=20=20https://juejin.im/post/5cf8e4b96f?= =?UTF-8?q?b9a07ed440f1d8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NavigationServiceRegister.java | 1 + .../NavigationService_flutterCanPop.java | 52 ++++++++++++++++++ example/ios/.symlinks/plugins/flutter_boost | 2 +- example/ios/.symlinks/plugins/xservice_kit | 2 +- example/ios/Podfile.lock | 10 ++-- example/ios/Runner.xcodeproj/project.pbxproj | 4 -- .../UserInterfaceState.xcuserstate | Bin 0 -> 35089 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 ++ example/ios/Runner/DemoRouter.m | 5 ++ example/lib/main.dart | 6 ++ example/lib/simple_page_widgets.dart | 6 +- ios/Classes/Boost/FLBPlatform.h | 3 + .../Container/FLBFlutterViewContainer.m | 2 + .../NavigationService_flutterCanPop.h | 16 ++++++ .../NavigationService_flutterCanPop.mm | 35 ++++++++++++ .../service/Service_NavigationService.h | 4 +- .../service/Service_NavigationService.mm | 12 +++- .../handlers/NavigationService_canPop.dart | 39 +++++++++++++ .../service/NavigationService.dart | 6 ++ .../service/NavigationServiceRegister.dart | 2 + lib/container/container_manager.dart | 3 + 21 files changed, 199 insertions(+), 16 deletions(-) create mode 100644 android/src/main/java/com/taobao/idlefish/flutterboost/NavigationService/NavigationService_flutterCanPop.java create mode 100644 example/ios/Runner.xcworkspace/xcuserdata/zhongchengguo.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 example/ios/Runner.xcworkspace/xcuserdata/zhongchengguo.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ios/Classes/Messaging/Generated/NavigationService/handlers/NavigationService_flutterCanPop.h create mode 100644 ios/Classes/Messaging/Generated/NavigationService/handlers/NavigationService_flutterCanPop.mm create mode 100644 lib/AIOService/NavigationService/handlers/NavigationService_canPop.dart diff --git a/android/src/main/java/com/taobao/idlefish/flutterboost/NavigationService/NavigationServiceRegister.java b/android/src/main/java/com/taobao/idlefish/flutterboost/NavigationService/NavigationServiceRegister.java index b7130bb..f731f01 100755 --- a/android/src/main/java/com/taobao/idlefish/flutterboost/NavigationService/NavigationServiceRegister.java +++ b/android/src/main/java/com/taobao/idlefish/flutterboost/NavigationService/NavigationServiceRegister.java @@ -33,6 +33,7 @@ NavigationService_pageOnStart.register(); NavigationService_openPage.register(); NavigationService_closePage.register(); + NavigationService_flutterCanPop.register(); } } \ No newline at end of file diff --git a/android/src/main/java/com/taobao/idlefish/flutterboost/NavigationService/NavigationService_flutterCanPop.java b/android/src/main/java/com/taobao/idlefish/flutterboost/NavigationService/NavigationService_flutterCanPop.java new file mode 100644 index 0000000..d0dfdf6 --- /dev/null +++ b/android/src/main/java/com/taobao/idlefish/flutterboost/NavigationService/NavigationService_flutterCanPop.java @@ -0,0 +1,52 @@ +package com.taobao.idlefish.flutterboost.NavigationService; + +import android.util.Log; + +import com.taobao.idlefish.flutterboost.FlutterBoostPlugin; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import fleamarket.taobao.com.xservicekit.handler.MessageHandler; +import fleamarket.taobao.com.xservicekit.handler.MessageResult; +import fleamarket.taobao.com.xservicekit.service.ServiceGateway; + +public class NavigationService_flutterCanPop implements MessageHandler<Boolean>{ + private Object mContext = null; + + + private boolean onCall(MessageResult<Boolean> result,Boolean canPop){ + return true; + } + + @Override + public boolean onMethodCall(String name, Map args, MessageResult<Boolean> result) { + return this.onCall(result,(Boolean) args.get("canPop")); + } + + @Override + public List<String> handleMessageNames() { + List<String> h = new ArrayList<>(); + h.add("flutterCanPop"); + return h; + } + @Override + public Object getContext() { + return mContext; + } + + @Override + public void setContext(Object obj) { + mContext = obj; + } + @Override + public String service() { + return "NavigationService"; + } + + public static void register(){ + ServiceGateway.sharedInstance().registerHandler(new NavigationService_flutterCanPop()); + } + + +} \ No newline at end of file diff --git a/example/ios/.symlinks/plugins/flutter_boost b/example/ios/.symlinks/plugins/flutter_boost index 4ae41bb..dee98da 120000 --- a/example/ios/.symlinks/plugins/flutter_boost +++ b/example/ios/.symlinks/plugins/flutter_boost @@ -1 +1 @@ -/Users/jidong/Documents/opensource/flutter_boost \ No newline at end of file +/Users/zhongchengguo/Desktop/flutter_boost \ No newline at end of file diff --git a/example/ios/.symlinks/plugins/xservice_kit b/example/ios/.symlinks/plugins/xservice_kit index 2738061..22dda44 120000 --- a/example/ios/.symlinks/plugins/xservice_kit +++ b/example/ios/.symlinks/plugins/xservice_kit @@ -1 +1 @@ -/Users/jidong/.pub-cache/hosted/pub.dartlang.org/xservice_kit-0.0.27 \ No newline at end of file +/Users/zhongchengguo/.pub-cache/hosted/pub.flutter-io.cn/xservice_kit-0.0.29 \ No newline at end of file diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 057d3ca..f686e22 100755 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -8,20 +8,20 @@ PODS: DEPENDENCIES: - Flutter (from `.symlinks/flutter/ios`) - - flutter_boost (from `/Users/jidong/Documents/opensource/flutter_boost/ios`) - - xservice_kit (from `/Users/jidong/.pub-cache/hosted/pub.dartlang.org/xservice_kit-0.0.27/ios`) + - flutter_boost (from `/Users/zhongchengguo/Desktop/flutter_boost/ios`) + - xservice_kit (from `/Users/zhongchengguo/.pub-cache/hosted/pub.flutter-io.cn/xservice_kit-0.0.29/ios`) EXTERNAL SOURCES: Flutter: :path: ".symlinks/flutter/ios" flutter_boost: - :path: "/Users/jidong/Documents/opensource/flutter_boost/ios" + :path: "/Users/zhongchengguo/Desktop/flutter_boost/ios" xservice_kit: - :path: "/Users/jidong/.pub-cache/hosted/pub.dartlang.org/xservice_kit-0.0.27/ios" + :path: "/Users/zhongchengguo/.pub-cache/hosted/pub.flutter-io.cn/xservice_kit-0.0.29/ios" SPEC CHECKSUMS: Flutter: 9d0fac939486c9aba2809b7982dfdbb47a7b0296 - flutter_boost: 24249d12d924d858cf445a84949484bc08bca000 + flutter_boost: 6a083f2f1b67f9b08724d6c4b280a099d1b40797 xservice_kit: a86c64372b3e41e7d8e9b1a0b9139866680f525c PODFILE CHECKSUM: 2a757a7bdc03b37a2814666652fdff1cf694243f diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 5336502..83dec23 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -45,7 +44,6 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; @@ -105,7 +103,6 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEBA1CF902C7004384FC /* Flutter.framework */, @@ -231,7 +228,6 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/example/ios/Runner.xcworkspace/xcuserdata/zhongchengguo.xcuserdatad/UserInterfaceState.xcuserstate b/example/ios/Runner.xcworkspace/xcuserdata/zhongchengguo.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..7bdcb07d5b6c2fac9258e3a2bb47a08fad4c8761 GIT binary patch literal 35089 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 I{eRwu-+udo?f?J) literal 0 HcmV?d00001 diff --git a/example/ios/Runner.xcworkspace/xcuserdata/zhongchengguo.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/example/ios/Runner.xcworkspace/xcuserdata/zhongchengguo.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..ed9a9b4 --- /dev/null +++ b/example/ios/Runner.xcworkspace/xcuserdata/zhongchengguo.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Bucket + type = "0" + version = "2.0"> +</Bucket> diff --git a/example/ios/Runner/DemoRouter.m b/example/ios/Runner/DemoRouter.m index f279b3f..f05ab45 100755 --- a/example/ios/Runner/DemoRouter.m +++ b/example/ios/Runner/DemoRouter.m @@ -52,4 +52,9 @@ [self.navigationController popViewControllerAnimated:animated]; } } + +- (void)flutterCanPop:(BOOL)canpop { + self.navigationController.interactivePopGestureRecognizer.enabled = !canpop; +} + @end diff --git a/example/lib/main.dart b/example/lib/main.dart index 0e5cc08..50dd80e 100755 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -33,11 +33,17 @@ class _MyAppState extends State<MyApp> { FlutterBoost.handleOnStartPage(); } + Map<String, WidgetBuilder> routes = { + "second": (BuildContext context) => + SecondRouteWidget(), + }; + @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Boost example', builder: FlutterBoost.init(postPush: _onRoutePushed), + routes: routes, home: Container()); } diff --git a/example/lib/simple_page_widgets.dart b/example/lib/simple_page_widgets.dart index 1036200..ab95460 100755 --- a/example/lib/simple_page_widgets.dart +++ b/example/lib/simple_page_widgets.dart @@ -12,7 +12,8 @@ class FirstRouteWidget extends StatelessWidget { child: RaisedButton( child: Text('Open second route'), onPressed: () { - FlutterBoost.singleton.openPage("second", {}, animated: true); + Navigator.pushNamed(context, "second"); +// FlutterBoost.singleton.openPage("second", {}, animated: true); }, ), ), @@ -31,7 +32,8 @@ class SecondRouteWidget extends StatelessWidget { child: RaisedButton( onPressed: () { // Navigate back to first route when tapped. - FlutterBoost.singleton.closePageForContext(context); + Navigator.pop(context); +// FlutterBoost.singleton.closePageForContext(context); }, child: Text('Go back!'), ), diff --git a/ios/Classes/Boost/FLBPlatform.h b/ios/Classes/Boost/FLBPlatform.h index 4b19d7d..22acf65 100755 --- a/ios/Classes/Boost/FLBPlatform.h +++ b/ios/Classes/Boost/FLBPlatform.h @@ -32,6 +32,9 @@ NS_ASSUME_NONNULL_BEGIN //Whether to enable accessibility support. Default value is Yes. - (BOOL)accessibilityEnable; +// flutteræ¨¡å—æ˜¯å¦è¿˜å¯ä»¥pop +- (void)flutterCanPop:(BOOL)canpop; + @required - (void)openPage:(NSString *)name params:(NSDictionary *)params diff --git a/ios/Classes/Container/FLBFlutterViewContainer.m b/ios/Classes/Container/FLBFlutterViewContainer.m index 0e48ef3..aee3057 100755 --- a/ios/Classes/Container/FLBFlutterViewContainer.m +++ b/ios/Classes/Container/FLBFlutterViewContainer.m @@ -283,6 +283,8 @@ static NSUInteger kInstanceCounter = 0; //Invalidate obsolete screenshot. [FLBStackCache.sharedInstance invalidate:self.uniqueIDString]; + [Service_NavigationService canPopPageName:_name params:_params + uniqueId:[self uniqueIDString]]; } #pragma mark - Life circle methods diff --git a/ios/Classes/Messaging/Generated/NavigationService/handlers/NavigationService_flutterCanPop.h b/ios/Classes/Messaging/Generated/NavigationService/handlers/NavigationService_flutterCanPop.h new file mode 100644 index 0000000..da4c4f8 --- /dev/null +++ b/ios/Classes/Messaging/Generated/NavigationService/handlers/NavigationService_flutterCanPop.h @@ -0,0 +1,16 @@ +// +// NavigationService_canPop.h +// flutter_boost +// +// Created by ZhongCheng Guo on 2019/6/5. +// + +#import "FlutterServiceCallHandler.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NavigationService_flutterCanPop : FlutterServiceCallHandler + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/Messaging/Generated/NavigationService/handlers/NavigationService_flutterCanPop.mm b/ios/Classes/Messaging/Generated/NavigationService/handlers/NavigationService_flutterCanPop.mm new file mode 100644 index 0000000..dee5638 --- /dev/null +++ b/ios/Classes/Messaging/Generated/NavigationService/handlers/NavigationService_flutterCanPop.mm @@ -0,0 +1,35 @@ +// +// NavigationService_canPop.m +// flutter_boost +// +// Created by ZhongCheng Guo on 2019/6/5. +// + +#import "NavigationService_flutterCanPop.h" +#import "ServiceGateway.h" +#import "FLBFlutterApplication.h" +#import "FlutterBoostConfig.h" + +@implementation NavigationService_flutterCanPop + +- (void)onCall:(void (^)(BOOL))result + canPop:(BOOL)canPop +{ + //Add your handler code here! + if ([[FLBFlutterApplication sharedApplication].platform respondsToSelector:@selector(flutterCanPop:)]) { + [[FLBFlutterApplication sharedApplication].platform flutterCanPop:canPop]; + } +} + +#pragma mark - Do not edit these method. +- (void)__flutter_p_handler_flutterCanPop:(NSDictionary *)args result:(void (^)(BOOL))result { + [self onCall:result canPop:[args[@"canPop"] boolValue]]; +} ++ (void)load{ + [[ServiceGateway sharedInstance] registerHandler:[NavigationService_flutterCanPop new]]; +} +- (NSString *)service +{ + return @"NavigationService"; +} +@end diff --git a/ios/Classes/Messaging/Generated/NavigationService/service/Service_NavigationService.h b/ios/Classes/Messaging/Generated/NavigationService/service/Service_NavigationService.h index c7d3d63..6b8768f 100755 --- a/ios/Classes/Messaging/Generated/NavigationService/service/Service_NavigationService.h +++ b/ios/Classes/Messaging/Generated/NavigationService/service/Service_NavigationService.h @@ -34,4 +34,6 @@ + (void)didDisappearPageContainer:(void (^)(NSNumber *))result pageName:(NSString *)pageName params:(NSDictionary *)params uniqueId:(NSString *)uniqueId; + (void)didInitPageContainer:(void (^)(NSNumber *))result pageName:(NSString *)pageName params:(NSDictionary *)params uniqueId:(NSString *)uniqueId; + (void)willDeallocPageContainer:(void (^)(NSNumber *))result pageName:(NSString *)pageName params:(NSDictionary *)params uniqueId:(NSString *)uniqueId; - @end \ No newline at end of file + // 获å–flutterçš„canPop + + (void)canPopPageName:(NSString *)pageName params:(NSDictionary *)params uniqueId:(NSString *)uniqueId; + @end diff --git a/ios/Classes/Messaging/Generated/NavigationService/service/Service_NavigationService.mm b/ios/Classes/Messaging/Generated/NavigationService/service/Service_NavigationService.mm index b8d09c4..4978d96 100755 --- a/ios/Classes/Messaging/Generated/NavigationService/service/Service_NavigationService.mm +++ b/ios/Classes/Messaging/Generated/NavigationService/service/Service_NavigationService.mm @@ -136,6 +136,14 @@ } }]; } + ++ (void)canPopPageName:(NSString *)pageName params:(NSDictionary *)params uniqueId:(NSString *)uniqueId{ + NSMutableDictionary *tmp = [NSMutableDictionary dictionary]; + if(pageName) tmp[@"pageName"] = pageName; + if(params) tmp[@"params"] = params; + if(uniqueId) tmp[@"uniqueId"] = uniqueId; + [self.service invoke:@"canPop" args:tmp result:^(id tTesult) { + }]; +} - - @end \ No newline at end of file + @end diff --git a/lib/AIOService/NavigationService/handlers/NavigationService_canPop.dart b/lib/AIOService/NavigationService/handlers/NavigationService_canPop.dart new file mode 100644 index 0000000..dfba199 --- /dev/null +++ b/lib/AIOService/NavigationService/handlers/NavigationService_canPop.dart @@ -0,0 +1,39 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:xservice_kit/ServiceCallHandler.dart'; +import 'package:xservice_kit/ServiceGateway.dart'; +import 'package:flutter_boost/flutter_boost.dart'; +import 'package:flutter_boost/AIOService/NavigationService/service/NavigationService.dart'; + +class NavigationService_canPop extends ServiceCallHandler { + static void regsiter() { + ServiceGateway.sharedInstance() + .registerHandler(new NavigationService_canPop()); + } + + @override + String name() { + return "canPop"; + } + + @override + String service() { + return "NavigationService"; + } + + @override + Future<bool> onMethodCall(MethodCall call) { + return onCall(call.arguments["pageName"], call.arguments["params"], + call.arguments["uniqueId"]); + } + +//==============================================Do not edit code above! + + Future<bool> onCall(String pageName, Map params, String uniqueId) async { + NavigatorState navigator = FlutterBoost.containerManager.onstageContainer; + bool canPop = navigator.canPop(); + NavigationService.flutterCanPop(canPop); + return true; + } +} \ No newline at end of file diff --git a/lib/AIOService/NavigationService/service/NavigationService.dart b/lib/AIOService/NavigationService/service/NavigationService.dart index 80a0ec9..b363b8e 100755 --- a/lib/AIOService/NavigationService/service/NavigationService.dart +++ b/lib/AIOService/NavigationService/service/NavigationService.dart @@ -93,4 +93,10 @@ return BOOL(value); }); } + /// 通知原生模å—flutter是å¦å¯ä»¥pop + static void flutterCanPop(bool canPop) { + Map<String,dynamic> properties = new Map<String,dynamic>(); + properties["canPop"]=canPop; + _service.methodChannel().invokeMethod('flutterCanPop',properties); + } } \ No newline at end of file diff --git a/lib/AIOService/NavigationService/service/NavigationServiceRegister.dart b/lib/AIOService/NavigationService/service/NavigationServiceRegister.dart index 5533b74..1518d85 100755 --- a/lib/AIOService/NavigationService/service/NavigationServiceRegister.dart +++ b/lib/AIOService/NavigationService/service/NavigationServiceRegister.dart @@ -30,6 +30,7 @@ import '../handlers/NavigationService_didDisappearPageContainer.dart'; import '../handlers/NavigationService_didInitPageContainer.dart'; import '../handlers/NavigationService_willDeallocPageContainer.dart'; + import '../handlers/NavigationService_canPop.dart'; class NavigationServiceRegister{ @@ -43,6 +44,7 @@ NavigationService_didDisappearPageContainer.regsiter(); NavigationService_didInitPageContainer.regsiter(); NavigationService_willDeallocPageContainer.regsiter(); + NavigationService_canPop.regsiter(); } } \ No newline at end of file diff --git a/lib/container/container_manager.dart b/lib/container/container_manager.dart index 26a8542..9c084eb 100755 --- a/lib/container/container_manager.dart +++ b/lib/container/container_manager.dart @@ -28,6 +28,7 @@ import 'package:flutter_boost/container/boost_container.dart'; import 'package:flutter_boost/container/container_coordinator.dart'; import 'package:flutter_boost/flutter_boost.dart'; import 'package:flutter_boost/support/logger.dart'; +import 'package:flutter_boost/container/navigator_observer.dart'; enum ContainerOperation { Push, Onstage, Pop, Remove } @@ -100,6 +101,8 @@ class ContainerManagerState extends State<BoostContainerManager> { assert(widget.initNavigator != null); _onstage = BoostContainer.copy(widget.initNavigator); + FlutterBoost.containerManager.navigatorObserver.addBoostNavigatorObserver(NavigatorCanPopObserver()); + WidgetsBinding.instance.addPostFrameCallback((_) { setState(() {}); }); -- 2.26.2