在《flutter-boost的集成与基本使用(android与flutter的混合开发)》中提到了在大部分情况下,我们不满足于简单的跳转,想要android原生和flutter进一步的融合,需要借助MethodChannel,利用它我们可以更好的完成原生与flutter页面的数据交互。

一、MethodChannel的实现:

(1)在android中,可以定义一个flutterPlugin,进行集中管理,代码如下:

package com.innovation.projector.pluginimport android.widget.Toast
import com.innovation.projector.MyApplication
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.PluginRegistryclass FlutterNativePlugin : FlutterPlugin, MethodChannel.MethodCallHandler {override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {//name必须和dart端的保持一致val channel = MethodChannel(binding.flutterEngine.dartExecutor, "com.innovation/name")channel.setMethodCallHandler(FlutterNativePlugin())}companion object {fun registerWith(registrar: PluginRegistry.Registrar) {val channel = MethodChannel(registrar.messenger(), "com.innovation/name")channel.setMethodCallHandler(FlutterNativePlugin())}}override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {}override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {when (call.method) {"androidMethodTest" -> result.success("android原生执行::" + call.arguments.toString() + call.method)"androidMethodToast" -> {Toast.makeText(MyApplication.getGlobalContext(),call.arguments.toString(),Toast.LENGTH_LONG).show()//result.success可以将接口返回的数据回传给flutterresult.success("python")}else -> result.notImplemented()}}
}

(2)在需要调用的activity中重写以下方法:

 @Overridepublic void configureFlutterEngine(@NonNull @NotNull FlutterEngine flutterEngine) {flutterEngine.getPlugins().add(new FlutterNativePlugin());}

(3)上面两步完成后,android端也就实现完毕,接下来dart端:

class AddDevicesPage extends StatefulWidget {final String title;AddDevicesPage({Key key, this.title}) : super(key: key);@override_AddDevicesPageState createState() => _AddDevicesPageState(title);
}class _AddDevicesPageState extends State<AddDevicesPage>with PageVisibilityObserver {String title;String result='保存';@overrideWidget build(BuildContext context) {return MaterialApp(theme: ThemeData(primaryColor: Colors.white,),home: Container(color: Colors.white,child: Column(mainAxisAlignment: MainAxisAlignment.start,children: [CommonTitleView(title, 1, null),Container(color: Colors.blue,//在这里体现child: GestureDetector(onTap: () async {await androidMethodTest();},child: Text(result,style: TextStyle(fontSize: 12, color: Colors.white),),),),],),),);}_AddDevicesPageState(this.title);Future<String> androidMethodTest() async {const platform = const MethodChannel('com.innovation/name');String result = "";try {result = await platform.invokeMethod('androidMethodToast', "test");//接受回调返回的参数,这里进行界面刷新提供更直观的效果setState(() {this.result = result;});} on Exception catch (e) {print(e.toString());}return result;}
}

二、糅合flutter-boost与MethodChannel的关键:

闲鱼技术团队提供的flutter-boost在跳转时会使用一个flutterboostactivity作为容器,在上一篇文章中的androidmanifest中提到,如果仅需要我们实现简单带参跳转,我们无需写出实例的activity,如果想两者一并使用,只需下面几步:

(1)在androidmanifest中申明一个新activity,以ToFlutterActivity为例:

        <!-- 这里的activity是给flutter跳转native留的 --><activity android:name=".ToAndroidActivity" /><!-- 这里的activity是给直接使用flutterboost进行跳转flutter页面留的原生activity容器 --><activityandroid:name="com.idlefish.flutterboost.containers.FlutterBoostActivity"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"android:hardwareAccelerated="true"android:theme="@style/Theme.FlutterTheme"android:windowSoftInputMode="adjustResize"><!--低端机上flutter-boost仍会出现跳转黑屏现象,这种方法可以解决,原理就是类似于原生闪屏页--><meta-dataandroid:name="io.flutter.app.android.SplashScreenUntilFirstFrame"android:value="true" /></activity><meta-dataandroid:name="flutterEmbedding"android:value="2" /><!-- 这里的activity是给使用flutterboost进行跳转并且想调用原生方法的flutter页面留的原生activity容器 --><activityandroid:name=".ToFlutterActivity"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"android:hardwareAccelerated="true"android:theme="@style/Theme.FlutterTheme"android:windowSoftInputMode="adjustResize"><meta-dataandroid:name="io.flutter.app.android.SplashScreenUntilFirstFrame"android:value="true" /></activity><activity android:name="io.flutter.embedding.android.FlutterActivity" />

(2)在自己的application中完成flutter-boost跳转的配置:

 @Overridepublic void onCreate() {super.onCreate();context = getApplicationContext();//alibaba flutter_booster android端配置集成FlutterBoost.instance().setup(this, new FlutterBoostDelegate() {@Overridepublic void pushNativeRoute(FlutterBoostRouteOptions options) {//这里的ToAndroidActivity是自己定义的,作为flutter跳原生的页面Intent intent = new Intent(FlutterBoost.instance().currentActivity(), ToAndroidActivity.class);FlutterBoost.instance().currentActivity().startActivityForResult(intent, options.requestCode());}@Overridepublic void pushFlutterRoute(FlutterBoostRouteOptions options) {//这里的ToFlutterActivity是自己定义的,作为原生跳flutter页面的容器Intent intent = new FlutterBoostActivity.CachedEngineIntentBuilder(ToFlutterActivity.class).backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent).destroyEngineWithActivity(false).uniqueId(options.uniqueId()).url(options.pageName()).urlParams(options.arguments()).build(FlutterBoost.instance().currentActivity());FlutterBoost.instance().currentActivity().startActivity(intent);}}, engine -> {});

(3)将ToFlutterActivity继承FlutterBoostActivity,重写onCreate()方法:

public class ToFlutterActivity extends FlutterBoostActivity {final private String TAG = "ToFlutterActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate");}@Overridepublic void configureFlutterEngine(@NonNull @NotNull FlutterEngine flutterEngine) {flutterEngine.getPlugins().add(new FlutterNativePlugin());}
}

·        以上就是糅合flutter-boost与MethodChannel的使用方法,如有不足,还望讨论。

———————————————————2021.8.12更新—————————————————

之前说了糅合MethodChannel的用法,下面再记录一种将原生控件用到flutter页面展示的方法,可以融合到这个文章里,三者一并使用。需要的可以查看我的文章《原生控件在flutter页面上的展示方法》。

糅合flutter-boost与MethodChannel的使用方法相关推荐

  1. flutter methodchannel调用原生方法,实现原生插件

    在获取手机电量,屏幕信息等,都需要flutter 调用原生实现,这部分flutter 官方已经帮我们实现好了,对于部分功能,需要自己实现, 步骤如下 # 创建一个 flutter 应用,使用 as 打 ...

  2. Flutter boost框架学习笔记

    1.知识点总结 1. Flutter简介以及Flutter Boost产生的原因 Flutter是一个由C++实现的Flutter Engine和由Dart实现的Framework组成的跨平台的技术框 ...

  3. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 MethodChannel 通信 )

    文章目录 一.MethodChannel 简介 二.MethodChannel 在 Dart 端的实现 1.MethodChannel 构造函数 2.invokeMethod 函数 3.MethodC ...

  4. flutter boost使用简介(踩坑记录,持续更新)

    前言 最近在研究android和flutter的混合开发.插件模式调用原生的混合模式已经在项目中使用,也暴露出一些问题, 最突出的问题就是flutter中对webview的支持,会出现各种各样奇怪的问 ...

  5. Flutter Boost 混合开发框架初探

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 作者丨xiangzhihong 来源: https://segmentfault.com/a/11900 ...

  6. boost::math模块使用 Brent 方法求函数最小值的示例

    boost::math模块使用 Brent 方法求函数最小值的示例 实现功能 C++实现代码 实现功能 boost::math模块使用 Brent 方法求函数最小值的示例 C++实现代码 #inclu ...

  7. boost::fibers模块实现适配方法调用的测试程序

    boost::fibers模块实现适配方法调用的测试程序 实现功能 C++实现代码 实现功能 boost::fibers模块实现适配方法调用的测试程序 C++实现代码 #include <boo ...

  8. git 提交两次commit到同一分支,被糅合为一次Marge Request的解决方法:cherry-pick

    简 述: git 提交两次commit到同一分支,且也push到同一个远程仓库的分支,会被糅合为一次Marge Request的解决方法:使用cherry-pick解决 文章目录 同步博文: 需求背景 ...

  9. flutter boost

    # 第一章 ​​​​​​​flutter组件化调研_lvwuxue的专栏-CSDN博客# 一.组件化接入方式跟原生组件化类似,共有两种方式接入:pod和framework怎么配置flutter环境,f ...

最新文章

  1. 线段树 ---- D. Power Tree(离线dfs序+线段树维护树上多条路径和的技巧)
  2. 简述java的线程_JAVA线程简述
  3. assert() (C++) 非常简单!
  4. 随机地址生成器_随机连接神经网络性能超过人工设计!何恺明等人发布新研究...
  5. Nginx的Gzip模块配置指令(一)
  6. mysql提权_mysql提权总结
  7. linux系统中/etc/syslog.conf文件解读
  8. java web ee_Java EE 6 Web配置文件。 在云上。 简单。
  9. OpenCV中的函数子
  10. Ubuntu下利用Wine安装AxureRP 8
  11. 牛客-1114E 老瞎眼 pk 小鲜肉(思维 + 离线 + 线段树 - 维护区间最小值)
  12. LivePlayer H5播放器、在react中使用
  13. 快过年了,用五种不同的JS特效带你看烟花(包邮送元宇宙图书)
  14. OpenCV更改图片颜色
  15. 如何申请:悟空问答,达人,金V认证!
  16. AI崛起,阿里的科技孵化力
  17. 公司-摩拜单车:摩拜单车
  18. android 实现区域截图
  19. android7.1 jack-admin 报错
  20. 第二届ACC(AcWing Cup)全国联赛

热门文章

  1. navicat for mysql 12 破解工具 亲测可用
  2. 输入一个四位数字x,分别求出x的个位数字、十位数字、百位数字和千位数字的值 ,并求个位、十位、百位、千位的和 -C语言
  3. 找自幂数的逐步优化算法
  4. Macbook如何更换固态硬盘【亲测有效】
  5. Maya - 后缀为xgen文件导出到虚幻引擎
  6. 解决Macbook互联网不能共享 因为它是受802.1X保户问题
  7. 【语音合成】TensorFlowTTS 中文文本转语音
  8. 【Latex 格式】Markdown或者LaTeX在单个字母上加一横、一点、两点、三角
  9. 《响应式Web设计性能优化》一2.3 Web运行时性能
  10. Philosopher’s Walk ICPC 2017 Daejeon F dfs 分治