flutter 生成aar文件,嵌入原生android项目

适用于flutter单独开发,android项目单独开发的场景

1:将flutter项目打包成aar文件,详情见官方文档:https://flutter.cn/docs/development/add-to-app/android/add-flutter-screen

2:在原生android项目文件中,项目根目录app/build.gradle文件中添加以下模块

String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
repositories {
    maven {
        url '可以写自己flutter项目的绝对路径比如:d:\flutter_pro\build\host\outputs\repo'
    }
    maven {
        url 'http://download.flutter.io'
    }
}

3:同样在项目根目录app/build.gradle文件中的 dependencies 模块添加以下代码

debugImplementation 'com.example.flutter项目名称:flutter_debug:1.0'
    profileImplementation 'com.example.flutter项目名称:flutter_profile:1.0'
    releaseImplementation 'com.example.flutter项目名称:flutter_release:1.0'

4:同样在项目根目录app/build.gradle文件中的  android/buildTypes 添加以下代码

    profile {
            initWith debug
        }

 ps:

1-4步在flutter生成aar文件完毕后,会在控制台打印出以上配置信息,请留意

5:在项目根目录app/src/main/AndroidManifest.xml中添加以下代码到 application 模块里

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

6:让项目自动下载依赖包

7:在android项目中想使用flutter的文件中引入包

import io.flutter.embedding.android.FlutterActivity;

8:调用flutter页面代码,调用逻辑按自己项目需求来

startActivity(
                FlutterActivity
                        .withNewEngine()
                        .initialRoute("自己flutter项目的页面路由如:/main")
//设置成"/",如果设置成/main,不是flutter页面的根路由,则点击物理返回按键的时候会出现先返回根路由然后返回android界面的bug .build(this) );

ps:

编译报错:在第5步中的 android:theme="@style/LaunchTheme" 出错

在src/main/res/values文件夹添加styles.xml ,内容如下

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             Flutter draws its first frame -->
        <item name="android:windowFullscreen">true</item>
    </style>
</resources>

继续编译,报错,Cannot fit requested classes in a single dex file

网上搜索原因是:

原因:项目貌似有点大,已经超过65k个方法。一个dex已经装不下了,需要个多个dex,也就是multidex ,因为Android系统定义总方法数是一个short int,short int 最大值为65536。

一脸懵逼,明明自己是写的个原生android  demo项目,整个页面就一个按钮

按照提示

在 app 的 build.gradle 文件中(原文地址:https://blog.csdn.net/MRYZJ/article/details/103463212)

android {
    defaultConfig {
            ···
        // 这里添加
        multiDexEnabled true
    }
}

dependencies {
    // 引入support支持库的multidex库
    implementation 'com.android.support:multidex:1.0.3'
    //或androidx支持库的multidex库
    implementation 'androidx.multidex:multidex:2.0.1'
}

运行,成功,点击按钮能正常出现flutter页面,但是中间会有一段黑屏时间,稍后解决,至少项目能够正常运行了

ps:
黑屏解决方案,网上很多,大概思路就是将主题设置为白色或者透明即可
代码可以修改为(将页面先初始化,调用的时候直接使用即可):
Intent demo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        demo = FlutterActivity
                .withNewEngine()
                .initialRoute("/main")
                .build(this);
    }

    public void getflutter(View view) {
        if(null == demo){
            Toast.makeText(this, "未找到flutter页面", Toast.LENGTH_SHORT).show();
        }else {
            startActivity(demo);
        }
    }


原文地址:https://www.cnblogs.com/liumang/p/14635031.html