当前位置:   article > 正文

原生Android项目中引入Flutter并实现android 与 flutter 之间的通信_已有的android工程支持flutter

已有的android工程支持flutter

前提条件:

    完成Flutter安装与环境搭建

一、原生Android项目中引入Flutter

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

项目 - > app -> build.gradle

  1. ......
  2. defaultConfig {
  3. ......
  4. ndk {
  5. // Flutter支持的体系结构过滤器
  6. abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
  7. }
  8. }

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文件中添加以下配置
  1. compileOptions {
  2. sourceCompatibility 1.8
  3. targetCompatibility 1.8
  4. }
        我们知道这是使用Java 8所需要的配置,在这里的作用是为了解决版本兼容问题,如果不配置的话运行项目可能会报错:Invoke-customs are only supported starting with Android O (--min-api 26)
如果新创建的Android项目build.gradle已存在,就不需要添加上述配置了。
  • 然后在项目根目录下的setting.gradle文件中配置:

  1. // 加入下面配置
  2. setBinding(new Binding([gradle: this]))
  3. evaluate(new File(
  4.         settingsDir.parentFile,
  5.         'flutter_data/.android/include_flutter.groovy'
  6. ))

说明: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:

  1. dependencyResolutionManagement {
  2. repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
  3. repositories {
  4. maven { url 'https://jitpack.io' }
  5. maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  6. maven { url 'https://maven.aliyun.com/repository/central' }
  7. maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
  8. google()
  9. mavenCentral()
  10. }
  11. }

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

  1. allprojects {
  2. repositories {
  3. maven { url 'https://jitpack.io' }
  4. maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
  5. maven { url 'https://maven.aliyun.com/repository/central' }
  6. maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
  7. google()
  8. mavenCentral()
  9. }
  10. }
  11. task clean(type: Delete) {
  12. delete rootProject.buildDir
  13. }

如图所示:

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

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

  1. dependencies {
  2. ......
  3. implementation project(':flutter')
  4. }

“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

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

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

  1. btnSendFlutter.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. startActivity(FlutterActivity.createDefaultIntent(MainActivity.this));
  5. }
  6. });
2)、上述跳转你会发现跳转有些慢或者常出现卡顿现象,所以我们常用带有 缓存的初始路由来 启动FlutterActivity
创建一个Application:
  1. public class MyApplication extends Application {
  2. private FlutterEngine flutterEngine;
  3. @Override
  4. public void onCreate() {
  5. super.onCreate();
  6. // 创建一个Flutter引擎
  7. flutterEngine = new FlutterEngine(this);
  8. // 开始执行 Dart 代码来预热flutter引擎
  9. flutterEngine.getDartExecutor().executeDartEntrypoint(
  10. DartExecutor.DartEntrypoint.createDefault()
  11. );
  12. //缓存Flutter引擎用来开启FlutterActivity
  13. FlutterEngineCache
  14. .getInstance()
  15. .put("my_engine_id", flutterEngine);
  16. }
  17. }

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

android:name=".MyApplication"

使用缓存引擎跳转Flutter:

  1. startActivity(
  2. FlutterActivity
  3. .withCachedEngine("my_engine_id")
  4. .build(MainActivity.this)
  5. );
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/810215
推荐阅读
相关标签
  

闽ICP备14008679号