flutter和android互相调用、android原生项目与flutter module之间的交互、如何在flutter module中使用原生的方法

这篇具有很好参考价值的文章主要介绍了flutter和android互相调用、android原生项目与flutter module之间的交互、如何在flutter module中使用原生的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、flutter项目与android之间的交互

1.flutter调用android中的方法

bridge.dart

//toAndroid  是定义好的通道名称

static final _android = MethodChannel('toAndroid');

static void invokeAndroidPay(requestMsg) async{

  //pay是android代码中定义的方法

  var result=await _android.invokeMethod('pay',requestMsg);

}

MainActivity.kt

class MainActivity: FlutterActivity() {

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {

        super.configureFlutterEngine(flutterEngine)

        GeneratedPluginRegistrant.registerWith(flutterEngine)

        val _android:MethodChannel=MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"toAndroid")

        _android.setMethodCallHandler { call, result -> {

            if(call.method!=null){

                if ("pay".equals(call.method)){

                    result.success(pay())

                }

            }else {

                result.notImplemented()

            }



        }

        }

    }

    fun pay():String{

        return "success"

    }

}

2.Android调用Flutter中的方法

MainActivity中

lateinit var toFlutter: MethodChannel

//configureFlutterEngine方法中添加

toFlutter = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "toFlutter");

//调用

toFlutter.invokeMethod("shopSuccess", "", object : MethodChannel.Result {

    override fun success(o: Any?) {}

    override fun error(s: String, s1: String?, o: Any?) {}

    override fun notImplemented() {}

})

Flutter中

static final platform = MethodChannel('toFlutter');

platform.setMethodCallHandler(flutterMethod);

Future<dynamic> flutterMethod(MethodCall methodCall) async{

  switch (methodCall.method) {

    case 'shopSuccess':

      //TODO 要处理的方法

      break;

  }

}

二、Android原生项目与flutter module之间的交互

android项目依赖flutter module的方式网上有很多,这里就不做讲解。主要说一下这种情况下android如何与flutter module之间进行方法的调用

踩坑:期初我是想让flutter module调用它内部中的.android文件夹下的原生代码。.android文件夹下有Flutter、app、src文件夹,我都尝试在里面写了上述提到的交互方式,发现并没有什么用。

然后我在Android原生项目里面写了上述提到的交互方式发现还是没有作用。

原因:

1.flutter module内只能写dart语言,也就是只能在lib文件夹下操作,不能在module里面写原生代码

2.Android原生项目启动flutter 的时候使用的方法

FlutterActivity.createDefaultIntent(this)

总结:

Android原生项目启动flutter使用的是FlutterEngine,要想后面可以和flutter module交互,

以下两个方法中使用的flutterEngine必须和启动flutter module使用的一样。

GeneratedPluginRegister.registerGeneratedPlugins(flutterEngine)
val _android: MethodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"toAndroid")

所以上代码

注册引擎放到缓存中,以免每次启动flutter module的时候响应慢

  fun registerEngine(routerName: String,context: Context) {
        val engine = FlutterEngine(context)
        engine.navigationChannel.setInitialRoute(routerName)
        engine.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())
        FlutterEngineCache.getInstance().put(routerName,engine)
    }

获取引擎

    fun getEngine(routerName: String):FlutterEngine?{
        return FlutterEngineCache.getInstance().get(routerName)
    }

启动flutter module

startActivity(FlutterActivity.withCachedEngine(routerName).build(this@MainActivity))

MainActivity继承flutterActivity并且设置交互方法

     val flutterEngine=EngineManager.getEngine(routerName)//获取引擎
        if (flutterEngine != null) {
            GeneratedPluginRegister.registerGeneratedPlugins(flutterEngine)
            val _android: MethodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"toAndroid")
            _android.setMethodCallHandler { call, result ->
                if (call.method != null) {
                    if ("mymethod".equals(call.method)) {
                        mymethod()
                    }

                } else {
                    result.notImplemented()

                }
            }
        }

routerName我这里用的是flutter module里面设置的routers

三、如果想在flutter module中调用原生方法该怎么办?

我的想法是给flutter module中添加一个flutter插件,这样flutter module调用插件中的dart方法,然后插件去调用插件中的原生方法。

如何创建flutter 插件的方法网上有很多,这里说一下flutter module使用此插件的方法是在module下创建一个plugins文件夹,然后把插件的整个文件夹复制到plugins文件夹下面,然后再在flutter module的yaml文件里配置一下依赖,这样path路径就好写了文章来源地址https://www.toymoban.com/news/detail-400216.html

到了这里,关于flutter和android互相调用、android原生项目与flutter module之间的交互、如何在flutter module中使用原生的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • KO之间互相调用

    假设有两个KO,命名为moduleA.KO,moduleB.KO,现在要实现在moduleB.KO中调用moduleA.KO中的函数。 源码: moduleA导出符号moduleA_func。 编译Makefile实现: 编译: 可以看出,moduleA_func已经在导出的符号表中了。 源码: 编译Makefile: 1、插入moduleA.ko 2、插入moduleB.ko 可以看出,moduleB成功调

    2024年02月05日
    浏览(30)
  • 各个微服务模块之间互相依赖调用的问题

    首先是模块之间不能够循环引用,否则会报循环依赖引入的错误。 没有了模块之间的相互依赖,在项目中这两个模块是相互调用的,分别各自定义相应的Feign接口,如下: 最开始写的运行报错的代码如下: 报错信息,如下: 报错的原因是这里定义了两个Feign接口,都是调用

    2024年02月11日
    浏览(32)
  • 在Android原生项目中 创建 Flutter模块

    应用场景: 在已有的 Android原生项目中,引入Flutter模块,摸索了两天,终于给整出来了; 如果是新项目 ,最好直接创建Flutter项目,然后在Fluter的 android / ios目录中,写原生代码; 本文除了讲解 Android原生如何创建Flutter模块外,还会演示在使用 Gradle 高版本 和 低版本  时可

    2024年01月19日
    浏览(28)
  • 【Unity】 基础交互入门(C#脚本互相调用的方法,含动态绑定脚本)

    脚本A: 在需要被调用的类里这样写: 脚本B: 在其他类里调用: 如果出现无法识别上下文的提示,检查一下以下问题: 1、两个脚本的命名空间是否一致,如果不需要的命名空间可以直接删除。 2、类名是否大写开头,且命名合法,且和文件名一致。 3、更新编译一下保存一

    2024年02月15日
    浏览(41)
  • UE和Android互相调用

    ue和android互调 这两种方式都是在UE打包的Android工程之上进行的。 一、首先是UE打包Android,勾选下面这项 如果有多个场景需要添加场景 工程文件在这个路径下 然后可以通过Android Studio打开,选择gradle打开 先运行一下,看看是否可以发布到Android设备上,然后再进行下一步。

    2024年04月26日
    浏览(23)
  • Flutter与原生IOS(swift)交互系列之一

    先用Android Studio创建一个空的flutter工程作为演示 可以看到根目录下有一个名为ios的目录,这个就是ios的工程目录。 我们将它展开,发现下面有许多个文件 打开苹果电脑上的Xcode 选择ios目录下的Runner.xcworkspace打开 打开之后如下图所示,我们点击AppDelegate这个文件,这个是ios工

    2024年02月02日
    浏览(26)
  • uniapp生成的h5与flutter的原生进行交互

            最近拿到需求是要配合app做一些h5的页面,刚好h5又是用uniapp生成的,使用起来跟普通的h5有些区别,所以在这里总结一下使用uniapp生成的h5页面如何跟flutter进行数据的传递 这里的 kjToLessonSubmit 是flutter那边写好的方法 这里值得注意的是,我们使用uniapp去书写代码的

    2024年02月11日
    浏览(28)
  • flutter实现调用原生安卓的高德地图导航功能(插件化)

    查看了高德地图flutter插件的文档,都没有能支持导航的功能,并且flutter的高德插件支持的功能特别少,没办法,只能使用安卓原生的导航,flutter去调用了,具体实现方式如下: 创建 Flutter 插件 使用--template=plugin 声明创建的是同时包含了 iOS 和 Android 代码的 plugin; 使用--o

    2024年02月16日
    浏览(34)
  • 【flutter和android原生的异步】

    java android 中,是多线程的 1.flutter中不要以为异步就是多线程  2.flutter的线程隔离理论? UI 线程 : 在 Flutter 中,UI 线程负责处理用户界面的构建和渲染。所有与用户界面相关的操作,例如布局计算、绘制和处理用户输入等,都在 UI 线程中执行。 UI 线程是单线程的,也称为主

    2024年04月15日
    浏览(30)
  • uniapp 与原生android 的交互

    uniapp打开第三方程序可以通过 HTML5+ API 的 runtime API 和 importClass 反射获取Android的Intent对象来实现,有两种方式,先说最简单的。 通过 runtime 可以跳转第三方程序,但是要指定的页面需要通过 runtime.openUrl 传入URLsheme地址 目前有个需求,需要和android进行交互并传参数过去然后进

    2024年02月14日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包