原生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)
);
  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
如果你的Flutter项目是在创建时未引入某个平台的,比如在创建项目时未引入Android平台,那么你可以按照以下步骤在Android Studio添加Android平台: 1. 打开你的Flutter项目,在顶部菜单栏选择`File` -> `New` -> `New Module`。 2. 在弹出的对话框选择`Android Library`,然后点击`Next`。 3. 在下一个界面输入你的Android库的名称,比如`flutter_android`,然后点击`Finish`。 4. 在Android Studio的左侧面板,展开`Project`视图,可以看到刚刚创建的`flutter_android`库。 5. 打开`flutter_android`库的`build.gradle`文件,在其添加以下代码: ``` apply plugin: 'com.android.library' android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { minSdkVersion 16 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } buildTypes { release { minifyEnabled false shrinkResources false } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) } ``` 注意修改`compileSdkVersion`和`targetSdkVersion`为你想要的版本。 6. 在Android Studio的左侧面板,展开你的Flutter项目,打开`android`目录下的`settings.gradle`文件,在最后添加以下代码: ``` include ':app' setBinding(new Binding([gradle: this])) evaluate(new File( settingsDir.parentFile, 'flutter_android/include_flutter.groovy' )) ``` 7. 在`android`目录下创建一个名为`include_flutter.groovy`的文件,并添加以下代码: ``` def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() def plugins = new Properties() def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') if (pluginsFile.exists()) { pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } } plugins.each { name, path -> def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() include ":$name" project(":$name").projectDir = pluginDirectory } ``` 8. 在Android Studio的顶部菜单栏选择`File` -> `Sync Project with Gradle Files`,等待同步完成。 9. 现在你就可以在你的Flutter项目使用Android平台了。可以在Flutter项目添加以下代码测试一下: ``` import android.os.Bundle; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.android.FlutterFragmentActivity; public class MainActivity extends FlutterFragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ``` 这是一个简单的Android Activity类,可以在Flutter项目使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yyxhzdm

你的鼓励是我创作的最大动力!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值