Flutter-module嵌入Android原生項(xiàng)目

從0開始模擬Flutter-module嵌入Android原生項(xiàng)目的流程。
環(huán)境是:xcode13.1、Android studio Arctic Fox | 2020.3.1 Patch 4、Flutter SDK 2.10.1

1、創(chuàng)建文件夾和文件

根據(jù)官網(wǎng)的文檔,首先,在桌面創(chuàng)建一個(gè)名為native_import_flutter_demo的文件夾,然后在該文件夾內(nèi)分別創(chuàng)建了android_demo、flutter_module兩個(gè)文件。關(guān)于flutter_module,可以用命令行:

flutter create --template module flutter_module

也可直接用Android studio創(chuàng)建
flutter_module.png

創(chuàng)建完成后,文件夾則如下所示:
image.png

2、設(shè)置ndk

官方是這樣說的:
image.png
android {
  //...
  defaultConfig {
    ndk {
      // Filter for architectures supported by Flutter.
      abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86_64'
    }
  }
}

3、引入 Java 8

官方是這樣說的:
image.png

查看自己的android_demo中已經(jīng)是這樣,所以不用改

 compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

4、將 Flutter 庫(kù)打包成由 AAR

cd到flutter_module目錄,執(zhí)行

$ flutter build aar

也可直接用Android studio工具:
image.png

執(zhí)行成功后如下圖:
build_aar.png

5、安裝提示配置gradle

一開始出現(xiàn)這種錯(cuò)誤:
8B0D445A35587E860AE343450598E295.png

后來又遇到Download fastutil-8.4.0-sources jar一直加載問題。最終,連外網(wǎng),一直等到右下角Gradle的下載完成為止,運(yùn)行不報(bào)錯(cuò),完成第一步。

按照文檔配置如下:

build_gradle.png

又有報(bào)錯(cuò),大致意思是:\color{brown}{build.gradle里的maven設(shè)置應(yīng)該挪到setting.gradle里}。于是挪到setting.gradle如下圖所示:
31D84EBD-7A95-4981-B6DA-51CF06474EEA.png

最后在項(xiàng)目右上角Sync一下。

6、運(yùn)行Android項(xiàng)目

運(yùn)行成功不報(bào)錯(cuò),則flutter-module嵌入成功。

7、添加一個(gè)Flutter頁面

在AndroidManifest.xml 文件中的 application 標(biāo)簽內(nèi)添加:

 <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"
            />

7、添加一個(gè)按鈕

image.png

8、點(diǎn)擊跳轉(zhuǎn)

首先導(dǎo)入:

import io.flutter.embedding.android.FlutterActivity;

添加點(diǎn)擊事件:

//緩存設(shè)置
        // Instantiate a FlutterEngine.
        flutterEngine = new FlutterEngine(this);
        // Start executing Dart code to pre-warm the FlutterEngine.
        flutterEngine.getDartExecutor().executeDartEntrypoint(
                DartExecutor.DartEntrypoint.createDefault()
        );
        // Cache the FlutterEngine to be used by FlutterActivity.
        FlutterEngineCache
                .getInstance()
                .put("my_engine_id", flutterEngine);


        Button button1 = (Button)findViewById(R.id.button2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(
                        //常規(guī)
                        //FlutterActivity.createDefaultIntent(MainActivity.this)
                        //緩存
                        FlutterActivity
                                .withCachedEngine("my_engine_id")
                                .build(MainActivity.this)
                );

            }
        });

9、在flutter_module里執(zhí)行flutter attach 進(jìn)行熱更新

Demo的github地址:native_import_flutter_demo

1645687388237947.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容