Flutter 79: 图解 Android Native 集成 FlutterBoost 小尝试 (二)
小菜前几天刚尝试接入 FlutterBoost,主要对其页面路由的跳转及传参等有了初步的认识,接下来是对日常操作的基本学习;
FlutterBoost 作为 Native 与 Flutter 之间的桥接方式,两端之间的数据传递是必不可少的;FlutterBoost 也是采用同样 Platform Channel 进行桥接,最常用的就是 MethodChannel;
插件注册
小菜在使用 Flutter Module 时会根据不同的业务模块注册不同的插件,小菜以前尝试单纯采用 Flutter 时需要 FlutterMain.startInitialization 初始化,而 FlutterBoost 也不例外;但是根据 FlutterBoost 的版本迭代,其注册的方式也随着有所变更,且必不可少;
小菜尝试的是 v1.12.13-hotfixes 版本,可以在 AndroidManifest.xml 中必须要添加 flutterEmbedding 版本设置注册插件方式,同时也可以通过 GeneratedPluginRegistrant 手动方式注册,此时均无需继承 FlutterApplication;
// AndroidManifest 方式注册 <meta-data android:name="flutterEmbedding" android:value="2"> </meta-data> // GeneratedPluginRegistrant 方式注册 FlutterBoost.BoostPluginsRegister pluginsRegister = new FlutterBoost.BoostPluginsRegister() { @Override public void registerPlugins(PluginRegistry mRegistry) { GeneratedPluginRegistrant.registerWith(FlutterBoost.instance().engineProvider()); } };
创建通信通道 Platform Channel
小菜在单纯使用 Flutter 时,创建通信通道尝试通过 MethodChannel / BasicMessageChannel / EventChannel,其中初始化时均需 FlutterView,小菜接入 FlutterBoost 后在 MainActivity 中创建通信通道,监听 onMethodChannel,在 Flutter 端监听到方法是可以正常通信的;
new MethodChannel(getFlutterView(), "test.ace.com/main").setMethodCallHandler(new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(MethodCall call, MethodChannel.Result result) { if (call.method.equals("ace_demo_user")) { Toast.makeText(this, "当前 method 为 ace_demo_user", Toast.LENGTH_LONG).show(); } else { result.notImplemented(); } } });
但是小菜是把 MainActivity 作为 FlutterView 来处理的,这样对于后期的维护以及业务方面的处理均不符合要求,并且据 FlutterBoost-issues 中提及在 v1.9 以后优化了创建通道的方法,在初始化 FlutterBoost 时会对 FlutterBoost LifeCycle 生命周期做监听;可在 onPluginsRegistered() 方法中进行创建;这样可以免去针对不同页面的 FlutterView 设置;
FlutterBoost.BoostLifecycleListener boostLifecycleListener = new FlutterBoost.BoostLifecycleListener() { @Override public void onEngineCreated() { } @Override public void onPluginsRegistered() { BinaryMessenger messenger = FlutterBoost.instance().engineProvider().getDartExecutor(); initMainMethod(messenger); } @Override public void onEngineDestroy() { } }; private void initMainMethod(BinaryMessenger messenger) { MethodChannel mMainChannel = new MethodChannel(messenger, "test.ace.com/main"); mMainChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(MethodCall call, MethodChannel.Result result) { if (call.arguments != null) { Log.e("TAG", "回调内容:" + call.arguments.toString()); } if (call.method != null) { Log.e("TAG", "回调方法:" + call.method.toString()); } if (call.method.equals("ace_demo_user")) { result.success(""); } else { result.notImplemented(); } } }); }
监听关闭路由
在使用 FlutterBoost 时,小菜按照官网方式封装了 openPageUrl 开启路由的方法,对于特殊页面的路由专场动画也可以单独设置,但对于关闭路由动画却不能直接设置;
小菜分析源码,在 Platform 中提供了 closeContainer() 方法,而其中 finishContainer() 可以通过获取当前 Activity 来关闭路由;
// 源码 public void closeContainer(IContainerRecord record, Map<String, Object> result, Map<String, Object> exts) { if (record == null) return; record.getContainer().finishContainer(result); } @Override public void finishContainer(Map<String, Object> result) { if (result != null) { setBoostResult(this.host.getActivity(), new HashMap<>(result)); this.host.getActivity().finish(); } else { this.host.getActivity().finish(); } }
closeContainer() 该方法并非抽象方法,但 Platform 是抽象类,所以小菜直接重写 closeContainer() 即可;
Platform platform = new Platform() { @Override public Application getApplication() { return BaseApplication.getInstance(); } @Override public void openContainer(Context context, String url, Map<String, Object> urlParams, int requestCode, Map<String, Object> exts) { router.openContainer(context, url, urlParams, requestCode, exts); } @Override public void closeContainer(IContainerRecord record, Map<String, Object> result, Map<String, Object> exts) { super.closeContainer(record, result, exts); // 获取路由 Activity 设置转场动画 } @Override public int whenEngineStart() { return FlutterBoost.ConfigBuilder.ANY_ACTIVITY_CREATED; } @Override public FlutterView.RenderMode renderMode() { return FlutterView.RenderMode.texture; } @Override public boolean isDebug() { return true; } @Override public String initialRoute() { return "/"; } };
小扩展
小菜在一个历史项目中集成 Flutter 和 FlutterBoost 遇到 Cause: assert appProject != null 如下问题;
Cause: assert appProject != null | | null false
小菜确定集成方式是正确的,于是查阅资料发现很容易解决;小菜历史项目的主 Module 是 news 更换为 app 即可;这个问题并非大问题,希望有相同问题的朋友可以提前避免;
小菜对 Flutter 及 FlutterBoost 的研究还不够深入,还在继续学习探索,如有错误请多多指导!
来源: 阿策小和尚
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
当中国诗词大会邂逅了Flutter,从此我的眼里只有你!
前言 Flutter是Google推出的跨平台的解决方案,Slogan是“Design beautiful apps”,国内也有知名企业在使用和推广,例如阿里、美团都有在尝试。 个人对其中的一些特性,比如JIT、Material Design、快速开发等很感兴趣,于是决定尝试一下。 诗词汇 于是诞生了诗词汇APP,首先看一下是个什么样的APP。 接下来我们一步步从不同方面说说Flutter的开发。 开始 FLutter可以在Windows、Linux、Mac上进行开发,开发工具可以使用VS Code、Android Studio、IDEA等,本文推荐使用Android Studio,主要在于Android Studio提供了FLutter Inspector工具,可以实时审查元素,解决界面的显示适配问题。 搭建开发环境 搭建环境的主要步骤: 下载SDK,下载地址。 配置PATH,如果使用Mac或者Linux系统,一定要将bin目录添加到系统PATH。 配置依赖源镜像,这一步很重要,并且需要将脚本放到启动shell中。 export PUB_HOSTED_URL=https://pub....
- 下一篇
使用SAP云平台Android SDK创建Mobile应用
既然是安卓开发,首先我们要下载Android Studio. 接着是从SAP官网下载SAP Cloud Platform的Android开发SDK: https://developers.sap.com/trials-downloads.html https://developers.sap.com/topics/cloud-platform-sdk-for-android.html Android SDK安装完毕后,使用项目创建向导新建一个项目: 使用SAP Cloud Platform mobile service上已经创建好的应用:com.sap.wizapp: 这个com.sap.wizapp的配置在SAP Cloud Platform的mobile services页面里打开如下: com.sap.edm.sampleservice.v2这个Destination提供了测试数据,包含product categories, product, supplier, customer和sales order等等。 完成项目创建向导。 SAP Cloud Platform Androi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS6,CentOS7官方镜像安装Oracle11G
- Linux系统CentOS6、CentOS7手动修改IP地址
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用