從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

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ò),大致意思是:

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