Skip to content

Commit

Permalink
SystemNavigator.pop can pop w/o UINavigationController (flutter#6341)
Browse files Browse the repository at this point in the history
* SystemNavigator.pop can pop w/o UINavigationController
  • Loading branch information
dnfield authored Sep 27, 2018
1 parent 0c096f7 commit 3052dbd
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,15 @@
#ifndef SHELL_PLATFORM_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMPLUGIN_H_
#define SHELL_PLATFORM_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMPLUGIN_H_

#include "flutter/fml/memory/weak_ptr.h"
#include "flutter/shell/platform/darwin/ios/framework/Headers/FlutterChannels.h"

@interface FlutterPlatformPlugin : NSObject
#include <UIKit/UIKit.h>

@interface FlutterPlatformPlugin : NSObject
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithViewController:(fml::WeakPtr<UIViewController>)viewController
NS_DESIGNATED_INITIALIZER;
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result;

@end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// found in the LICENSE file.

#include "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.h"
#include "flutter/fml/logging.h"

#include <AudioToolbox/AudioToolbox.h>
#include <Foundation/Foundation.h>
Expand Down Expand Up @@ -31,7 +32,26 @@

using namespace shell;

@implementation FlutterPlatformPlugin
@implementation FlutterPlatformPlugin {
fml::WeakPtr<UIViewController> _viewController;
}

- (instancetype)init {
@throw([NSException exceptionWithName:@"FlutterPlatformPlugin must initWithViewController"
reason:nil
userInfo:nil]);
}

- (instancetype)initWithViewController:(fml::WeakPtr<UIViewController>)viewController {
FML_DCHECK(viewController) << "viewController must be set";
self = [super init];

if (self) {
_viewController = viewController;
}

return self;
}

- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
NSString* method = call.method;
Expand Down Expand Up @@ -178,9 +198,13 @@ - (void)popSystemNavigator {
// Apple's human user guidelines say not to terminate iOS applications. However, if the
// root view of the app is a navigation controller, it is instructed to back up a level
// in the navigation hierarchy.
// It's also possible in an Add2App scenario that the FlutterViewController was presented
// outside the context of a UINavigationController, and still wants to be popped.
UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([viewController isKindOfClass:[UINavigationController class]]) {
[((UINavigationController*)viewController) popViewControllerAnimated:NO];
} else if (viewController != _viewController.get()) {
[_viewController.get() dismissViewControllerAnimated:NO completion:nil];
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#include <memory>

#include "flutter/fml/memory/weak_ptr.h"
#include "flutter/fml/message_loop.h"
#include "flutter/fml/platform/darwin/platform_version.h"
#include "flutter/fml/platform/darwin/scoped_nsobject.h"
Expand All @@ -34,6 +35,7 @@ @implementation FlutterViewController {
fml::scoped_nsobject<FlutterDartProject> _dartProject;
shell::ThreadHost _threadHost;
std::unique_ptr<shell::Shell> _shell;
std::unique_ptr<fml::WeakPtrFactory<FlutterViewController>> _weakFactory;

// Channels
fml::scoped_nsobject<FlutterPlatformPlugin> _platformPlugin;
Expand Down Expand Up @@ -65,6 +67,7 @@ - (instancetype)initWithProject:(FlutterDartProject*)projectOrNil
bundle:(NSBundle*)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
_weakFactory = std::make_unique<fml::WeakPtrFactory<FlutterViewController>>(self);
if (projectOrNil == nil)
_dartProject.reset([[FlutterDartProject alloc] init]);
else
Expand Down Expand Up @@ -209,7 +212,8 @@ - (void)setupChannels {
binaryMessenger:self
codec:[FlutterJSONMessageCodec sharedInstance]]);

_platformPlugin.reset([[FlutterPlatformPlugin alloc] init]);
_platformPlugin.reset(
[[FlutterPlatformPlugin alloc] initWithViewController:_weakFactory->GetWeakPtr()]);
[_platformChannel.get() setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
[_platformPlugin.get() handleMethodCall:call result:result];
}];
Expand Down

0 comments on commit 3052dbd

Please sign in to comment.