import
import
import
import
@interfaceDemoRouter :NSObject
@property(nonatomic,strong)UINavigationController*navigationController;
@property(nonatomic,copy)FlutterEventSinknativeCallFlutterEventSink;
@property (strong, nonatomic)FlutterViewController * fvc;
- (DemoRouter*)sharedRouter;
@end
//
// MyFlutterRouter.m
// iOS_Flutter
//
// Created by 谢泽锋 on 2019/11/12.
// Copyright © 2019年 谢泽锋. All rights reserved.
//
define weakSelf __weak typeof(self) weakSelf = self;
import "DemoRouter.h"
import "ViewController.h"
@implementation DemoRouter
-
(void)openPage:(NSString*)name
params:(NSDictionary*)params animated:(BOOL)animated completion:(void(^)(BOOL))completion
{
NSLog(@"打开页面传递的参数 = %@",params);
NSString *type = [[params objectForKey:@"query"] objectForKey:@"type"];
if([typeisEqualToString:@"App"]) {
//测试flutter跳转原生以及传递参数
ViewController *vc = [[ViewController alloc] init];
vc.title = [[params objectForKey:@"query"] objectForKey:@"key"];
[self.navigationController pushViewController:vc animated:animated];
return;
}
//原生(flutter)跳转flutter页面 的方法
if([params[@"present"]boolValue]){
FLBFlutterViewContainer *vc = FLBFlutterViewContainer.new;
[vcsetName:nameparams:params];
[self.navigationController presentViewController:vc animated:animated completion:^{}];
}else{
FLBFlutterViewContainer *vc = FLBFlutterViewContainer.new;
[vcsetName:nameparams:params];
[self.navigationController pushViewController:vc animated:animated];
}
}
- (BOOL)accessibilityEnable
{
return YES;
}
- (void)closePage:(NSString)uid animated:(BOOL)animated params:(NSDictionary)params completion:(void(^)(BOOL))completion
{
NSLog(@"关闭页面传递的参数 = %@",params);
FLBFlutterViewContainer *vc = (id)self.navigationController.presentedViewController;
if([vc isKindOfClass:FLBFlutterViewContainer.class] && [vc.uniqueIDString isEqual: uid]){
[vcdismissViewControllerAnimated:animated completion:^{}];
}else{
[self.navigationController popViewControllerAnimated:animated];
}
}
- (void)setFvc:(FlutterViewController *)fvc
{
_fvc= fvc;
if(fvc !=nil){
[self setupFlutterCallNative];
// [self setupNativeCallFlutter];
}
}
pragma mark - FlutterCallNative
- (void)setupFlutterCallNative
{
// 用于Flutter 调用 Native
// 这个channelname必须与Native里接收的一致
FlutterMethodChannel *flutterCallNativeChannel = [FlutterMethodChannel methodChannelWithName:@"samples.flutter.io/flutterCallNative" binaryMessenger:self.fvc];
NSLog(@"======-=-=-=-=-=");
[flutterCallNativeChannelsetMethodCallHandler:^(FlutterMethodCall*call,FlutterResultresult) {
NSLog(@"method: %@",call.method);
NSLog(@"arguments: %@",call.arguments);
}];
}
pragma mark - NativeCallFlutter
- (void)setupNativeCallFlutter
{
// 用于Native调用Flutter
FlutterEventChannel *nativeCallFlutterChannel = [FlutterEventChannel eventChannelWithName:@"samples.flutter.io/nativeCallFlutter" binaryMessenger:self.fvc];
[nativeCallFlutterChannelsetStreamHandler:self];
}
- (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events
{
self.nativeCallFlutterEventSink = events;
// static NSInteger mm = 0;
// [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
// if (!_eventSink) return;
// NSString *txt = [NSString stringWithFormat:@" iOS倒计时 %ld秒",++mm];
// _eventSink(txt);
// }];
return nil;
}
-
(FlutterError*)onCancelWithArguments:(id)arguments {
//[[NSNotificationCenter defaultCenter] removeObserver:self];
self.nativeCallFlutterEventSink = nil;
return nil;
}
- (void)callFluterWithName:(NSString*)name params:(id)params
{
if(self.nativeCallFlutterEventSink){
self.nativeCallFlutterEventSink(@{@"name":name?:@"",@"params":params ?: [NSNullnull]});
}else{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[selfcallFluterWithName:nameparams:params];
});
}
}
- (DemoRouter*)sharedRouter
{
staticDemoRouter*_instance =nil;
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
_instance = [[DemoRouteralloc]init];
// 在这里初始化FlutterViewController
// 初始化Router
[FlutterBoostPlugin.sharedInstance startFlutterWithPlatform:_instance onStart:^(FlutterViewController * fvc){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.001 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
DemoRouter.sharedRouter.fvc = fvc;
});
}];
});
return_instance;
}
@end