android ios 交叉推广,Flutter与Android、iOS 混合+交互

说明/注意点:

1.Flutter模块建立之后会生成隐藏文件.android和.iOS,混合混的就是这个。

2.Android需要跳转到flutter页面最简单的方式是startActivity(FlutterActivity.createDefaultIntent(this));这里FlutterActivity来自io.flutter.embedding.android.FlutterActivity,切勿弄错。

3.Android三种跳转方式(核心:FlutterEngine):

a.进入到默认flutter - main 页面

startActivity(FlutterActivity.createDefaultIntent(this));

b.进入到flutter - 指定route页面

startActivity(FlutterActivity.withNewEngine().initialRoute("123").build(this));

c.进入到指定方法页面 - 通过执行指定到方法进入到页面,默认指定的是main,所以这个算是对a,b的复杂化写法

先得创建一个FlutterEngine去启动这个方法

FlutterEngine engine =new FlutterEngine(this);

DartExecutor.DartEntrypoint dartEntrypoint =new DartExecutor.DartEntrypoint(FlutterMain.findAppBundlePath(),"test");

engine.getDartExecutor().executeDartEntrypoint(dartEntrypoint);

FlutterEngineCache.getInstance().put("test",engine);

startActivity(FlutterActivity.withCachedEngine("test").build(this));

4.iOS三种跳转方式(核心:FlutterEngine)

a.进入到默认flutter - main 页面

FlutterEngine *flutterEngine = [[FlutterEngine alloc] initWithName:@"engine"];

[flutterEngine run];

FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];

[self presentViewController:flutterViewController animated:YES completion:nil];

b.进入到flutter - 指定route页面 - !!不能创建engine,如果要获取engine从 flutterViewController.engine - 官方api在setInitialRoute有说明

FlutterViewController *flutterViewController = [[FlutterViewController alloc]initWithProject:[[FlutterDartProject alloc]init] nibName:nil bundle:nil];

[flutterViewController setInitialRoute:@"123"];

[self presentViewController:flutterViewController animated:YES completion:nil];

c.进入到指定方法页面 - 通过执行指定到方法进入到页面,默认指定的是main,所以这个算是对a的复杂化写法

FlutterEngine *flutterEngine = [[FlutterEngine alloc] initWithName:@"engine1"];;

[flutterEngine runWithEntrypoint:@"test" libraryURI:nil];

FlutterViewController*flutterViewController =

[[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nilbundle:nil];

[self presentViewController:flutterViewController animated:YES completion:nil];

注意:Android 中 new FlutterEngine 就必须指定这个engine执行哪个方法,即executeDartEntrypoint,所以c特殊;iOS 中run就是默认main,但是如果需要指定路由进入则不能手动调用run,所以b特殊。

5.交互:Flutter和Android方使用的是MethodChannel和EventChannel; iOS方使用的是FlutterMethodChannel和FlutterEventChannel。核心依然是FlutterEngine,Engine就是一个贯穿始终的驱动器,用哪个Engine驱动的页面也应该用哪个Engine去交互。

6.Flutter传输到Native直接创建一个MethodChannel然后methodChannel.invokeMethod()就可以;Native注意channelName和methodName保持一致,可以通过result回调函数回调结果给flutter。

7.Native传输到Flutter通过创建一个EventChannel,flutter通过eventChannel.receiveBroadcastStream().listen,涉及到stream,那么怎么把东西添加到stream呢,自然是sink。所以Native setStreamHandler 将接口/协议中的EventSink保存起来,在需要传值的地方触发回调就好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值