原生Android项目中引入Flutter并实现android 与 flutter 之间的通信

前提条件:

    完成Flutter安装与环境搭建

一、原生Android项目中引入Flutter

1、在Android项目中,添加Flutter支持的体系结构过滤器

项目 - > app -> build.gradle

        ......   
 defaultConfig {
        ......

        ndk {
            // Flutter支持的体系结构过滤器
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
        }
    }

2、 Android Studio需要将你的 Flutter 模块作为依赖:

1)、在现有Android项目同级目录终端创建flutter module

前往File > New > New Flutter Project…

选择“Flutter”

填写你的 Flutter SDK path 

之后点击“Next

点击“Next”之后,进入下面图示:

备注:
Project name:创建Flutter项目名称
Projrct location:项目安装路径(要放在Android项目同级目录
Project type:选择“Module
之后点击“Create”即创建一个新的Flutter Module项目。
2)、引入逻辑
  • 在app下的build.gradle文件中添加以下配置
compileOptions {
  sourceCompatibility 1.8
  targetCompatibility 1.8
} 
        我们知道这是使用Java 8所需要的配置,在这里的作用是为了解决版本兼容问题,如果不配置的话运行项目可能会报错:Invoke-customs are only supported starting with Android O (--min-api 26)
如果新创建的Android项目build.gradle已存在,就不需要添加上述配置了。
  • 然后在项目根目录下的setting.gradle文件中配置:

// 加入下面配置

setBinding(new Binding([gradle: this]))

evaluate(new File(

        settingsDir.parentFile,

        'flutter_data/.android/include_flutter.groovy'

))

说明:flutter_data是上面刚创建的Flutter Module项目名称

之后“Sync Now”一下项目。

  • 如果sync项目报Failed to apply plugin class 'FlutterPlugin'.错

解决办法:
打开setting.gradle,将repositoriesMode改为:RepositoriesMode.PREFER_PROJECT

改后:

将RepositoriesMode模式替换后,再点击“Try Again”

如果还遇到第三方解析失败,在app -> build.gradle中添加maven:

dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
  repositories {
    maven { url 'https://jitpack.io' }
    maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
    maven { url 'https://maven.aliyun.com/repository/central' }
    maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
    google()
    mavenCentral()
  }
}

另外在项目下的build.gradel 添加:

allprojects {
  repositories {
    maven { url 'https://jitpack.io' }
    maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
    maven { url 'https://maven.aliyun.com/repository/central' }
    maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
    google()
    mavenCentral()
  }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

如图所示:

  • Sync后我们可以看到项目中多了一个名称为flutter的library module:

我们需要在app下的build.gradle文件中添加该module的依赖。

dependencies {
    ......

    implementation project(':flutter')
}

“Sync”一下项目这样就成功地将Flutter引入到了Android原生项目中。

二、Android与Flutter交互

        上面的项目,每次要看flutter代码是不是每次都要切过来切过去的,所以呢,我们可以在setting.gradle 加上这么一行代码:

加下面两行主要目的是直接在原生的app工程下,查看flutter的代码,避免切来切去

include "flutter_data"

project(':flutter_data').projectDir = new File('../flutter_data')

添加代码后“sync”项目,会生成flutter_data项目,这样就可以直接在原生app中修改flutter中代码了。

1、Android跳转Flutter

1)、在清单AndroidManifest里面添加 FlutterActivity在清单AndroidManifest里面添加 FlutterActivity

 <activity
            android:name="io.flutter.embedding.android.FlutterActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize" />

在MainActivity中,调用点击事件,直接跳转:

btnSendFlutter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(FlutterActivity.createDefaultIntent(MainActivity.this));
            }
 });
2)、上述跳转你会发现跳转有些慢或者常出现卡顿现象,所以我们常用带有 缓存的初始路由来 启动FlutterActivity
创建一个Application:
public class MyApplication extends Application {
    private FlutterEngine flutterEngine;

    @Override
    public void onCreate() {
        super.onCreate();
        // 创建一个Flutter引擎
        flutterEngine = new FlutterEngine(this);

        // 开始执行 Dart 代码来预热flutter引擎
        flutterEngine.getDartExecutor().executeDartEntrypoint(
                DartExecutor.DartEntrypoint.createDefault()
        );

        //缓存Flutter引擎用来开启FlutterActivity
        FlutterEngineCache
                .getInstance()
                .put("my_engine_id", flutterEngine);
    }

}

在AndroidManifest.xml中使用引用的Application:

android:name=".MyApplication"

使用缓存引擎跳转Flutter:

startActivity(
     FlutterActivity
    .withCachedEngine("my_engine_id")
    .build(MainActivity.this)
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/258474.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus是什么?能干嘛?

MyBatis-Plus是一个基于MyBatis的增强工具&#xff0c;旨在简化开发、提高效率。它提供了通用的mapper和service&#xff0c;可以在不编写任何SQL语句的情况下&#xff0c;快速实现对单表的CRUD、批量、逻辑删除、分页等操作。 MyBatis-Plus的主要特性包括&#xff1a; 无侵入…

c# OpenCV 基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)

我们将在这里演示如何使用几何形状和文本注释图像。 Cv2.Line() 绘制直线 Cv2.Ellipse() 绘制椭圆Cv2.Rectangle() 绘制矩形Cv2.Circle() 绘制圆Cv2.FillPoly() 绘制多边形Cv2.PutText() 绘制文本 一、绘制直线 Cv2.Line(image, start_point, end_point, color, thickness) …

轻量应用服务器对比:亚马逊云科技简便易用领先一步

在云计算服务中&#xff0c;小型、中小型企业或个人开发者经常会选择轻量应用服务器&#xff0c;这种服务器简单、易用、成本低廉&#xff0c;能够轻松地托管和运行各种应用程序、网站或开发项目。轻量应用服务器的设计初衷也是为了让云计算服务更加亲民、易用&#xff0c;让一…

java中基本类型之间的转换

基本类型容量 java中的 8 种基本数据类型&#xff0c;以及它们的占内存的容量大小和表示的范围 byte&#xff1a;字节型&#xff0c;占内存容量为 1 个字节&#xff08;8 位&#xff09;&#xff0c;表示范围为 -128&#xff08;-2^7&#xff09;到 127&#xff08;2^7-1&…

2001年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

今天是2023年12月20日&#xff0c;距离2024年的AMC8正式考试倒计时30天。 从战争中学习战争最有效&#xff0c;对于各类考试、竞赛来说&#xff0c;从历年的真题中来了解考试题型、考试形式、对知识点查漏补缺最有效。 前几天&#xff0c;六分成长分析了2023年、2022年、2020、…

ADS学习笔记(一)——更新中

在ADS中&#xff0c;信号上升时间为信号从0&#xff5e;100&#xff05;所用的时间&#xff0c;而实际上定义的上升边均为10&#xff05;&#xff5e;90&#xff05;&#xff0c;所以可以认为上升边&#xff1d;0.8*ADS设置上升时间。 一、终端开路及短路的反射信号 1.仿真条…

vue-count-to 数字滚动插件

使用npm 安装 npm install vue-count-to 页面引入 import countTo from 路径 <countTo :startVal"0" :endVal"100" />

【nfweb 发版图文】

发版步骤 更新后台版本号 把两个文件中的ver更改为对应发版的版本号、保存提交 master 操作 git pull 【拉取最新主分支内容】git merge xxx 【合并对应的分支到主分支】npm run build 【打包】 打包生成build文件 将build文件调整为以下格式 压缩build文件 发版 标签…

另一种理解伦敦金支撑阻力位的方法

支撑阻力位一向被认为是做伦敦金交易不可或缺的分析工具&#xff0c;但很多人对它的原理并不清楚&#xff0c;甚至不太服气&#xff0c;觉得凭什么一根平平无奇的水平位&#xff0c;能带来所谓的“大作用”呢&#xff1f;下面我们不妨从另外一个角度来看一下伦敦金市场中的支撑…

spring 定时任务Scheduler和异步任务Async

1. 概述 Spring框架分别通过TaskExecutor和TaskScheduler接口为任务提供异步执行和调度。 ThreadPoolTaskScheduler(继承自TaskScheduler)ThreadPoolTaskExecutor&#xff08;继承自TaskExecutor&#xff09;备注含义任务调度器&#xff0c;定时任务线程池执行器&#xff0c;…

MySQL 8.0 InnoDB Tablespaces之File-per-table tablespaces(单独表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之File-per-table tablespaces&#xff08;单独表空间&#xff09;File-per-table tablespaces&#xff08;单独表空间&#xff09;相关变量&#xff1a;innodb_file_per_table使用TABLESPACE子句指定表空间变量innodb_file_per_table设置…

以存算一体芯片加速汽车智能化进程,后摩智能带来更优解?

汽车产业的长期价值锚点已悄然变化&#xff0c;催生出新的商业机遇。 过去&#xff0c;在燃油车市场&#xff0c;燃油经济性和品牌认知度等是重要的消费决策因素和资本价值衡量标准&#xff0c;但在新能源时代&#xff0c;产业价值聚焦在两方面&#xff0c;一是电动化&#xf…

<一>Python变量以及数据类型、命名规则及输出输入语句

一、变量的定义 定义变量的语法为&#xff1a;变量名变量值。(这里的 作用是赋值。) 定义变量后可以使用变量名来访问变量值。 变量就是用来‘盛放’数据的容器。 二、变量的类型 三、查看数据类型 如果临时想要查看一个变量存储的数据类型&#xff0c;可以使用 type(变量…

企业特别大的文件用什么传比较快,企业快速传输大文件必备神器

对于企业而言&#xff0c;不论是内部的文件交换、协作、备份&#xff0c;还是外部的文件分享、投标、审计&#xff0c;都需要高效、稳定、安全的文件传输方式。特别是对于一些特别大的文件&#xff0c;如视频、音频、图片、设计图、数据库等&#xff0c;如果传输速度慢、不稳定…

Flutter实现丝滑的滑动删除、移动排序等-Dismissible控件详解

文章目录 Dismissible 简介使用场景常用属性基本用法举例注意事项 Dismissible 简介 Dismissible 是 Flutter 中用于实现可滑动删除或拖拽操作的一个有用的小部件。主要用于在用户对列表项或任何其他可滑动的元素执行删除或拖动操作时&#xff0c;提供一种简便的实现方式。 使…

什么店生意好?C++采集美团商家信息做数据分析

最近遇到几个朋友&#xff0c;想要一起合伙投资一个实体店&#xff0c;不问类型&#xff0c;就看哪类产品相对比较受欢迎。抛除地址位置&#xff0c;租金的影响&#xff0c;我们之谈产品。因此&#xff0c;我熬了几个通宵&#xff0c;写了这么一段爬取美团商家商品信息的数据并…

vue中使用minio上传文件

创建一个 文件getOssClient import { getOssSetting } from "/api/common"; import Vue from "vue"; import { getCookies, getLocal } from "/utils/auth"; // get token from cookie export async function getStsToken() {//从后台获取stsTo…

澳鹏干货解答!“关于机器学习的十大常见问题”

探索机器学习的常见问题&#xff0c;了解机器学习和人工智能的基本概念、原理、发展趋势、用途、方法和所需的数据要求从而发掘潜在的商机。 什么是机器学习&#xff1f; 机器学习即教授机器如何学习的过程&#xff0c;为机器提供指导&#xff0c;帮助它们自己开发逻辑&#…

STM32G030C8T6:使用按键控制LED亮灭(外部中断)

本专栏记录STM32开发各个功能的详细过程&#xff0c;方便自己后续查看&#xff0c;当然也供正在入门STM32单片机的兄弟们参考&#xff1b; 本小节的目标是&#xff0c;系统主频64 MHZ,采用高速外部晶振&#xff0c;通过KEY1 按键的PA0 引脚配置成中断输入引脚&#xff0c;PB9引…