zoukankan      html  css  js  c++  java
  • 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);
            }
        }


  • 相关阅读:
    GitLab 内存使用优化
    记一次 GitLab 的迁移过程
    MAC 最全快捷键
    IDEA中通过Java调用Python脚本报错
    远程服务调用PRC发展史
    分布式&微服务传送门
    (11)MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)
    不懂物理的前端不是好的游戏开发者(一)—— 物理引擎基础
    京东购物小程序 | Taro3 项目分包实践
    浅谈树模型与集成学习-从决策树到GBDT
  • 原文地址:https://www.cnblogs.com/liumang/p/14635031.html
Copyright © 2011-2022 走看看