IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android原生项目集成Flutter项目混合开发 -> 正文阅读

[移动开发]Android原生项目集成Flutter项目混合开发

按照官方文档的集成方式有2种,一种的aar的打包集成方式,一种是引入model的形式,这里主要说下aar打包的方式我遇到的问题,按照官方提供的打包方式我打包下来是没有flutter依赖的第三方插件,百度和谷歌看来下,如果flutter集成了第三方插件的话 需要使用fat-aar插件来打包aar

fat-aar官方文档: https://github.com/kezong/fat-aar-android
flutter官方文档:https://flutter.dev/docs/development/add-to-app/android/project-setup

首先说下我百度谷歌搜送到的基本都是说在flutter中的.android下app中的build.gradle中配置文件,但是我按照集成下来是走不通的,后面看了下在.android下Flutter中的build.gradle来配置,主要修改这2个build.gradle配置文件

build.gradle

按照官方的配置来就行了,这里提一下,需要Open android module in Android Studio

在这里插入图片描述

在项目根目录build.gradle下载fat–aar插件

buildscript {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath 'com.github.kezong:fat-aar:1.3.6'

    }
}

allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
}

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

fultter中build.gradle配置中配置引用fat-aar:apply plugin: ‘com.kezong.fat-aar’,后面基本是按照fat-aar官方提供的文档来走了!

pply plugin: 'com.android.library'
apply plugin: 'com.kezong.fat-aar'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
dependencies {
    implementation fileTree(dir: 'libs', include: '*.jar')
    // java dependency
    embed project(path: ':lib-java', configuration: 'default')
    // aar dependency
    embed project(path: ':lib-aar', configuration: 'default')
    // aar dependency
    embed project(path: ':lib-aar2', configuration: 'default')
    // local full aar dependency, just build in flavor1
    flavor1Embed project(path: ':lib-aar-local', configuration: 'default')
    // local full aar dependency, just build in debug
    debugEmbed(name: 'lib-aar-local2', ext: 'aar')
    // remote jar dependency
    embed 'com.google.guava:guava:20.0'
    // remote aar dependency
    embed 'com.facebook.fresco:fresco:1.12.0'
    // don't want to embed in
    implementation('androidx.appcompat:appcompat:1.2.0')
}

以上就是flutter 使用fat-aar打包aar方式,下面集成到Android原生项目中

把aar直接复制到Android项目中引用aar,在app中引入,这里除了引用aar包之外,还需要添加各个 cpu 版本 flutter.so 和 flutter_embedding.jar

repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies{
 api (name: 'flutter-release', ext: 'aar')

    implementation 'io.flutter:flutter_embedding_release:1.0.0-241c87ad800beeab545ab867354d4683d5bfb6ce'
    implementation 'io.flutter:armeabi_v7a_release:1.0.0-241c87ad800beeab545ab867354d4683d5bfb6ce'
    implementation 'io.flutter:arm64_v8a_release:1.0.0-241c87ad800beeab545ab867354d4683d5bfb6ce'
    implementation 'io.flutter:x86_64_release:1.0.0-241c87ad800beeab545ab867354d4683d5bfb6ce'
    }

后面的1.0.0-241c87ad800beeab545ab867354d4683d5bfb6ce项目是对应的版本号

在这里插入图片描述
在这里插入图片描述

在build.gradle引入

 repositories {
  mavenCentral()
        maven {
            url "http://download.flutter.io"
        }
 }

之后在AndroidManifest.xml中引用就可以了

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

MyFlutterActivity是跳转到flutter 页面的 使用的时候 直接跳转到MyFlutterActivity就可以了

public class MyFlutterActivity extends FlutterActivity {
    // 定义Channel名称
    private static final String CHANNEL_NATIVE = "com.flutterToNative";

    public static void openFlutter(Activity activity, String routerUrl) {
        Intent intent = MyFlutterActivity.withNewEngine()
                .initialRoute(routerUrl)
                .build(activity);
        //设置Activity透明
        //intent.putExtra("background_mode","transparent");
        activity.startActivity(intent);
    }

    public static CCEngineIntentBuilder withNewEngine() {
        return new CCEngineIntentBuilder(MyFlutterActivity.class);
    }

    public static CCEngineIntentBuilder withNewEngine(Class<? extends FlutterActivity> activityClass) {
        return new CCEngineIntentBuilder(activityClass);
    }

    public static class CCEngineIntentBuilder extends NewEngineIntentBuilder {

        protected CCEngineIntentBuilder(Class<? extends FlutterActivity> activityClass) {
            super(activityClass);
        }
    }

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);

        //此处是Flutter与原生通信方法,暂时可不关注
        MethodChannel methodChannel = new MethodChannel(flutterEngine.getDartExecutor(), CHANNEL_NATIVE);
        methodChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {
            @Override
            public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
//                System.out.println("MethodChannel call.method:" + call.method.toString() + "  call arguments:" + call.arguments.toString());
//                NSString *token = [UserDefUtils getUserDefValue:ACCECESSTOKEN];
				//这里是和flutter页面进行交互的,call.method是你和flutter页面约定好的method
                switch (call.method) {
                    case "backToNative":
//                        result.success(2);
                        finish();
                        break;
                    case "iOSFlutter2":
                        Map<String,String> map=new HashMap<>();
                        map.put("token",LoginInfoModel.getToken());
                        map.put("username", UserInfoModel.getNikeName());
                        map.put("serverip", Constant.Config.BASEIP+"/");
                        String newToken = LoginInfoModel.getToken();
                        result.success(map);//这里是传参数给flutter的,是一个objec 按照自己的方式来传,
                        break;
                    default:
                        result.error("404", "未匹配到对应的方法" + call.method, null);
                }
            }
        });
    }
}

注: 至此Android集成flutter 结束 ,如果需要使用缓存或带有缓存引擎的初始路由看下官方文档配置,个人记录,比较粗

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:46:00  更:2021-07-29 11:47:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 18:14:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码