关山初度尘未洗,策马扬鞭再奋蹄!这篇文章主要讲述Flutter 专题79 图解 Android Native 集成 FlutterBoost 小尝试#yyds干货盘点#相关的知识,希望能为你提供帮助。
小菜前几天刚尝试接入 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="https://www.songbingjia.com/android/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
||
nullfalse
小菜确定集成方式是正确的,于是查阅资料发现很容易解决;小菜历史项目的主 Module 是 news 更换为 app 即可;这个问题并非大问题,希望有相同问题的朋友可以提前避免;
【Flutter 专题79 图解 Android Native 集成 FlutterBoost 小尝试#yyds干货盘点#】 小菜对 Flutter 及 FlutterBoost 的研究还不够深入,还在继续学习探索,如有错误请多多指导!
推荐阅读
- MYSQL随笔八 does not exist or is not executable
- 不懂DHCP服务,来找我
- MYSQL随笔九 binlog日志清理
- 《LinuxProbe》—RHCE 学习 Day6-8
- 如何使用Angular和Bootstrap打开弹出窗口()
- 如何从给定的字符串中删除标点符号()
- 如何使用JavaScript将时间四舍五入到最近的四分之一小时()
- Go中的数据类型介绍和用法指南
- Python如何使用Kivy中的AnchorLayout(布局示例)