diff --git a/ios/Classes/Boost/FlutterBoostPlugin.m b/ios/Classes/Boost/FlutterBoostPlugin.m index ff8441cfa0d6134e2b05a79f81199d6af809ee76..67760b5a9ebf88230f1a19d57b2fdb9c9ef8b393 100755 --- a/ios/Classes/Boost/FlutterBoostPlugin.m +++ b/ios/Classes/Boost/FlutterBoostPlugin.m @@ -94,7 +94,11 @@ pageInfo[@"params"] = [FlutterBoostPlugin sharedInstance].fParams; pageInfo[@"uniqueId"] = [FlutterBoostPlugin sharedInstance].fPageId; if(result) result(pageInfo); - }else{ + } if([@"disablePopGesture" isEqualToString:call.method]) { + [FlutterBoostPlugin sharedInstance].application.flutterViewController.navigationController.interactivePopGestureRecognizer.enabled = NO; + } if([@"enablePopGesture" isEqualToString:call.method]){ + [FlutterBoostPlugin sharedInstance].application.flutterViewController.navigationController.interactivePopGestureRecognizer.enabled = YES; + } else{ result(FlutterMethodNotImplemented); } } diff --git a/lib/container/boost_container.dart b/lib/container/boost_container.dart index d28a0c6558a47699c39c1bed2e56bcda5d6f94a6..dd006347aaa80455f408766b82f3986e9653f8f0 100755 --- a/lib/container/boost_container.dart +++ b/lib/container/boost_container.dart @@ -21,6 +21,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'container_manager.dart'; import '../flutter_boost.dart'; @@ -201,6 +203,11 @@ class BoostContainerState extends NavigatorState { if (canPop()) { super.pop<T>(result); + if (Platform.isIOS && multipleRouteMode && !canPop()) { + FlutterBoost.singleton.channel + .invokeMethod<dynamic>('enablePopGesture', null); + //å¼€å¯native返回手势 + } } else { if (T is Map<String, dynamic>) { FlutterBoost.singleton @@ -229,6 +236,11 @@ class BoostContainerState extends NavigatorState { .postPushRoute(name, uniqueId, params, newRoute ?? route, future); } + if (Platform.isIOS && multipleRouteMode && canPop()) { + FlutterBoost.singleton.channel + .invokeMethod<dynamic>('disablePopGesture', null); + } + return future; } diff --git a/lib/container/container_coordinator.dart b/lib/container/container_coordinator.dart index 9d70dfa8846a5deef15e7f30f1cb5fa8058c17ac..4bd55d40d1f0a39704aa9370aae13ee07f3fd7f3 100755 --- a/lib/container/container_coordinator.dart +++ b/lib/container/container_coordinator.dart @@ -32,6 +32,17 @@ import 'boost_container.dart'; import '../flutter_boost.dart'; import '../support/logger.dart'; +class BoostRouteSettings { + final String uniqueId; + final String name; + final Map params; + + const BoostRouteSettings({this.uniqueId, this.name, this.params}); +} + +typedef BoostRouteSettings BoostRouteSettingsBuilder(String url, + {Map<String, dynamic> urlParams, Map<String, dynamic> exts}); + class ContainerCoordinator { static ContainerCoordinator get singleton => _instance; @@ -40,6 +51,7 @@ class ContainerCoordinator { final Map<String, PageBuilder> _pageBuilders = <String, PageBuilder>{}; PageBuilder _defaultPageBuilder; + BoostRouteSettingsBuilder _routeSettingsBuilder; ContainerCoordinator(BoostChannel channel) { assert(_instance == null); @@ -94,6 +106,22 @@ class ContainerCoordinator { return page; } + BoostRouteSettings createRouteSettings(String url, + {Map<String, dynamic> urlParams, Map<String, dynamic> exts}) { + if (_routeSettingsBuilder != null) { + return _routeSettingsBuilder(url, urlParams:urlParams,exts:exts); + } + + return BoostRouteSettings( + uniqueId: '${url}_${DateTime.now().millisecondsSinceEpoch}', + name: url, + params: urlParams); + } + + void registerRouteSettingsBuilder(BoostRouteSettingsBuilder builder) { + _routeSettingsBuilder = builder; + } + //Register a default page builder. void registerDefaultPageBuilder(PageBuilder builder) { _defaultPageBuilder = builder; diff --git a/lib/flutter_boost.dart b/lib/flutter_boost.dart index 7627fd81fae1de1b431a0174063cbf88049ce46a..357bb7beeeb4331827a45f71c8f352d2a0b602ce 100755 --- a/lib/flutter_boost.dart +++ b/lib/flutter_boost.dart @@ -28,6 +28,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'container/boost_container.dart'; import 'container/container_coordinator.dart'; +import 'container/container_coordinator.dart'; import 'container/container_manager.dart'; import 'channel/boost_channel.dart'; @@ -37,6 +38,7 @@ import 'observers_holders.dart'; export 'container/boost_container.dart'; export 'container/container_manager.dart'; export 'flutter_boost_api.dart'; +export 'container/container_coordinator.dart' show BoostRouteSettings; typedef Widget PageBuilder(String pageName, Map params, String uniqueId); @@ -48,6 +50,9 @@ typedef void PostPushRoute(String url, String uniqueId, Map params, Route route, typedef Route FlutterBoostRouteBuilder(Widget widget); + + + class FlutterBoost { static final FlutterBoost _instance = FlutterBoost(); final GlobalKey<ContainerManagerState> containerManagerKey = @@ -124,6 +129,11 @@ class FlutterBoost { ContainerCoordinator.singleton.registerPageBuilders(builders); } + ///Register a route settings builder + void registerRouteSettingsBuilder(BoostRouteSettingsBuilder builder) { + ContainerCoordinator.singleton.registerRouteSettingsBuilder(builder); + } + Future<Map<dynamic, dynamic>> open(String url, {Map<String, dynamic> urlParams, Map<String, dynamic> exts}) { @@ -145,14 +155,15 @@ class FlutterBoost { Map<String, dynamic> exts, FlutterBoostRouteBuilder routeBuilder}) { -// if(!ContainerCoordinator.singleton.isFlutterPageUrl(url)){ -// return open(url, urlParams: urlParams, exts: exts); -// } - String uniqueId='${url}_${DateTime.now().millisecondsSinceEpoch}'; + final BoostRouteSettings routeSettings = ContainerCoordinator.singleton.createRouteSettings(url,urlParams: urlParams,exts: exts); final Widget page = ContainerCoordinator.singleton.createPage( - url, urlParams, uniqueId); + routeSettings.name, routeSettings.params, routeSettings.uniqueId); + + if (page == null ) { + return open(url, urlParams: urlParams, exts: exts); + } final Route<Map<dynamic, dynamic>> route = routeBuilder != null ? routeBuilder(page) diff --git a/lib/flutter_boost_api.dart b/lib/flutter_boost_api.dart index a6998d9cf57209173e2e050c3cd1d34a623e436c..e8ea4f1e9d08cb69f1ceaf25cc84bc796fc1a00c 100644 --- a/lib/flutter_boost_api.dart +++ b/lib/flutter_boost_api.dart @@ -7,13 +7,7 @@ import 'flutter_boost.dart'; typedef Route FlutterBoostRouteBuilder(Widget widget); -class BoostRouteSettings { - final String uniqueId; - final String name; - final Map params; - const BoostRouteSettings({this.uniqueId, this.name, this.params}); -} typedef BoostRouteSettings BoostRouteSettingsBuilder(String url, {Map<String, dynamic> urlParams, Map<String, dynamic> exts});