Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

SystemNavigator.pop can pop w/o UINavigationController #6341

Merged
merged 5 commits into from
Sep 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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