详解Flutter 调用 Android Native 的方法

Flutter 调用 Android Native 的方法,是通过MethodChannel的方式来实现的:

在Android端:

  • 创建一个Class,实现FlutterPlugin和MethodCallHandler接口
  • 重写onAttachedToEngine(),onDetachedFromEngine(),onMethodCall()
  • onAttachedToEngine()中,根据自定义的CHANNEL_NAME创建MethodChannel, onDetachedFromEngine中,释放MethodChannel
  • onMethodCall中,通过自定义的METHOD_NAME,来响应Flutter中,invokeMethod对Native的通信,代码如下
class MethodChannelPlugin : FlutterPlugin, MethodChannel.MethodCallHandler {

  private var methodChannel: MethodChannel? = null
  private var mNoteForFlutterListener: NoteForFlutterListener? = null

  companion object {
    private const val CHANNEL_NAME = "method_channel"
    private const val METHOD_NAME = "saveNote"
    val instance: MethodChannelPlugin by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
      MethodChannelPlugin()
    }
  }

  override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
    methodChannel = MethodChannel(binding.binaryMessenger, CHANNEL_NAME)
    methodChannel?.setMethodCallHandler(this)
  }

  override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
    methodChannel?.setMethodCallHandler(null)
    methodChannel = null
  }

  override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
    if (call.method == METHOD_NAME) {
      val content = call.argument<String>("content")
      mNoteForFlutterListener?.sendData(content!!)
      result.success("success")
    } else {
      result.notImplemented()
    }
  }

  fun setListener(noteForFlutterListener: NoteForFlutterListener) {
    mNoteForFlutterListener = noteForFlutterListener
  }

在Flutter端:

  • 根据Native中定义的METHOD_NAME来创建MethodChannel
  • 通过MethodChannel.invokeMethod(METHOD_NAME,params),参数METHOD_NAME为Native中定义的METHOD_NAME,params为传递的参数,就可以和Native进行通信了,在Native的onMethodCall方法中,通过call.method == METHOD_NAME来确定,Flutter是否调用的是Native中定义的METHOD_NAME的方法,代码如下
class NoteMainFulState extends State<NoteMainFul> {
 //flutter 和 native 通信
 static const _methodMessageChannel = MethodChannel("method_channel");
 TextField textField;
 TextEditingController textEditingController;

 @override
 Widget build(BuildContext context) {
  return Scaffold(
   body: Container(
    margin: EdgeInsets.fromLTRB(20.0, 60.0, 20.0, 20.0),
    child: Column(
     children: [
      Container(
       child: Column(
        children: [
         textField = TextField(
          //去掉下划线
          decoration: InputDecoration(border: InputBorder.none),
          enabled: true,
          controller: textEditingController = NoteTextEditingController(),
          keyboardType: TextInputType.multiline,
          textInputAction: TextInputAction.newline,
          maxLines: null,
         ),
         RichText(
          text: TextSpan(),
         ),
        ],
       ),
      ),
      Container(
       color: Colors.deepPurple,
       height: 50,
       child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
         GestureDetector(
          child: Icon(
           Icons.forward,
          ),
          onTap: clickOut,
         )
        ],
       ),
      )
     ],
    ),
   ),
  );
 }

 void clickOut() async {
  //调用native方法,返回首页
  var content = textEditingController.text;
  Map<String, dynamic> map = {"content": content};
  var result = await _methodMessageChannel.invokeMethod("saveNote", map);
  print("result $result");
 }

以上就是Flutter 调用 Android Native 的方法的过程,有时间再分析下他们的实现原理
待续....
附,我当前的Flutter版本是 :
Flutter 1.22.3 • channel stable • https://github.com/flutter/flutter
Framework • revision 8874f21e79 (3 months ago) • 2020-10-29 14:14:35 -0700
Engine • revision a1440ca392
Tools • Dart 2.10.3

到此这篇关于详解Flutter 调用 Android Native 的方法的文章就介绍到这了,更多相关Flutter 调用Android Native内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android studio 切换flutterSDK之后报错及解决办法(推荐)

    Windows系统上面修改了flutter sdk的环境变量地址之后Android studio上面运行flutter项目就会报错 类似于: Could not read script XXX\flutter.gradle' as it does not exist. 还有这样:flutter:Warning! The 'flutter' tool you are currently running is from a different Flutter repository 解决办法: 1.首

  • android studio 3.6.1升级后如何处理 flutter问题

    前提条件介绍 1.android-studio-3.6.1 死丢丢 配置了dart 和flutter插件 在 3.5.3时 成功运行过flutter工程 2.flutter 版本 Flutter 1.12.13+hotfix.8 • channel stable • https://github.com/flutter/flutter.git Framework • revision 0b8abb4724 (5 weeks ago) • 2020-02-11 11:44:36 -0800 Eng

  • Android Studio 下 Flutter 开发环境搭建,Flutter,Dart 插件安装,Flutter SDK 安装,环境变量配置,开发环境检查

    I . Flutter 学习资料 Flutter 学习资料 : ① 官方文档 : https://flutter.dev/docs ② Flutter Android 开发者文档 : https://flutter.dev/docs/get-started/flutter-for/android-devs ② Flutter 插件库 : https://pub.dev/ II . Flutter 开发环境搭建 Flutter 开发环境搭建 : ① Android Studio : https:/

  • Flutter 和 Android 互相传递数据的实现

    (一)Android代码设置 1,打开Android Studio 创建一个应用程序,包名dev.android.book 2, 创建一个MyApplication ,应用在AndroidManifest.xml文件中的application的android:name属性上 3,创建FlutterEngine的实例,然后把这个实例添加到缓存的FlutterEngine当中 4,创建MethodChannel的实例,指定一个此实例的唯一字符串,例如dev.android.book/add 5, 设

  • Flutter中嵌入Android 原生TextView实例教程

    前言 本篇文章 中写到的是 flutter 调用了Android 原生的 TextView 案例 添加原生组件的流程基本上可以描述为: 1 android 端实现原生组件PlatformView提供原生view 2 android 端创建PlatformViewFactory用于生成PlatformView 3 android 端创建FlutterPlugin用于注册原生组件 4 flutter 平台嵌入 原生view 1 创建原生组件 创建在fLutter工程时会生成几个文件夹,lib是放fl

  • 解决flutter 错误: 程序包androidx.lifecycle不存在问题

    发生于编译时:错误: 程序包androidx.lifecycle不存在 先贴一段报错log,让你更加准确的匹配问题所在,对症下药,药,切克闹. D:\study\flutter\flutter\.pub-cache\hosted\pub.flutter-io.cn\flutter_plugin_android_lifecycle-1.0.8\android\src\main\java\io\flutter\embedding\engine\plugins\lifecycle\FlutterLif

  • Flutter下Android Studio配置gradle的方法

    一.失败的经历:手动配置gradle 下载gradle包http://gradle.org/gradle-download/ Mac Finder->Applications/应用程序->Android Studio右键显示包内容.继续打开Contents文件夹,正常情况下会有一个gradle文件夹,将下载解压之后的文件复制到这个文件夹下.如果Contents文件夹下没有gradle文件夹,创建gradle文件夹,继续后面的操作 配置gradle环境路径 打开终端,打开系统环境配置文件vim

  • android使用flutter的ListView实现滚动列表的示例代码

    现如今打开一个 App,比如头条.微博,都会有长列表,随着我们不断地滑动,视窗内的内容也会不断地更新.今天就用 Flutter 实现一下这种效果. 这里的表现其实就相当于有一个固定长度的容器,然后超出的内容是不可见的,只有当你向上或向下滑动屏幕时,视窗外看不见的内容才会出现在视窗中.如果在 web 开发时,是需要容器加上样式 overflow: auto; 要想用 Flutter 实现,其实也是很简单的,因为 Flutter 为我们提供了 ListView 组件. ListView 主要有以下几

  • Android Studio下Flutter环境搭建图文教程

    一.Flutter介绍 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费.开源的. 二.环境搭建 Flutter 的环境搭建⼗分省⼼,特别对应Android开发者⽽⾔,只是在AndroidStuido上安装 插件,并下载flutterSdk到本地,配置在环境变量即可,其实 中⽂⽹的搭建Futter开发环境 已经很贴⼼详细,从

  • 新版Flutter集成到已有Android项目的实现

    FlutterSDK升级后,我们发现不能按照原来的方式集成到已有Android项目中了,因为没有了Flutter这个类,通过阅读源码我找到了新的使用方式. 一.创建Flutter Module 在已有Android工程中集成flutter,可以使用AndroidStudio的new Flutter Module实现,方便快捷. 找到FlutterModule,一连串的next操作即可 创建完成后我们的项目中会多一个叫做flutter的module 并且在项目的setting.gradle文件中会

  • Flutter调用Android和iOS原生代码的方法示例

    前言 本文主要给大家介绍了关于Flutter调用Android和iOS原生代码的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 分3个大步骤: 1.在flutter中调用原生方法 2.在Android中实现被调用的方法 3.在iOS中实现被调用的方法 在flutter中调用原生方法 场景,这里你希望调用原生方法告诉你一个bool值,这个值的意义你可以随意定,这里表示的意义是是否是中国用户. 你可以在flutter中设计好要调用的方法名称,这里就叫 isChinese 请

  • Flutter Android端启动白屏问题的解决

    问题描述 Flutter 应用在 Android 端上启动时会有一段很明显的白屏现象,白屏的时长由设备的性能决定,设备性能越差,白屏时间越长. 问题分析 其实启动白屏的问题在Android原生应用上也是一个常见问题,大致是因为从用户点击 Launcher Icon 到应用首页显示之间,Android 系统在完成应用的初始化工作,其流程如下: 在 Flutter Android 端上,白屏的问题会更加严重,因为除了 Android 应用启动耗时外,还增加了 Flutter 初始化耗时. 直到 Fl

随机推荐