在現(xiàn)有項目上集成Flutter
1.在andorid工程目錄上級目錄下執(zhí)行命令:
flutter create -t module xxxx(想要創(chuàng)建的flutter項目名)
執(zhí)行完后辽幌,一個和Android項目平級的flutter項目就已經(jīng)創(chuàng)建好了祠汇。
2.添加flutter到當(dāng)前Android項目:
在Android項目根目錄下的settings.gradle文件中,添加如下代碼:
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir.parentFile,
"flutter_hybrid/.android/include_flutter.groovy"
))
然后修肠,在項目的app目錄下,build.gradle文件中,添加如下dependency:
implementation project(':flutter')
如上谈截,添加完之后,準(zhǔn)備工作就完成了。
集成Flutter頁面跳轉(zhuǎn)
通過繼承FlutterActivity跳到默認(rèn)頁面
1.Application:初始化Flutter
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
FlutterMain.startInitialization(this);
}
}
2.Activity:繼承FlutterActivity
/**
* debug模式原生跳轉(zhuǎn)到flutter界面會出現(xiàn)白屏簸喂,release包就不會出現(xiàn)白屏了
*/
public class MainFlutterActivity extends FlutterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
}
這樣以后毙死,我們就可以跳轉(zhuǎn)這個MainFlutterActivity,實(shí)現(xiàn)在Android工程里面進(jìn)入Flutter工程的默認(rèn)頁面了喻鳄。
通過FlutterView跳到指定頁面
首先通過Flutter.createFlutterView方法來創(chuàng)建一個FlutterView類型的View扼倘。它有三個構(gòu)造參數(shù):
public static FlutterView createView(Activity activity, Lifecycle lifecycle, String initialRoute)
三個參數(shù)分別是:
1.Activity,即當(dāng)前附著的Activity
2.LifeCycle除呵,且是不能為空(NonNull)的再菊,這也就要求我們必須用AppCompatActivity來承載FlutterView了,如果我們的Activity繼承自android.app.Activity是沒有g(shù)etLifeCycle()這個方法的颜曾。
public class FlutterViewActivity extends AppCompatActivity 復(fù)制代碼
3.initialRoute這是一個String類型的變量纠拔,根據(jù)不同的標(biāo)識跳轉(zhuǎn)不同的Flutter頁面:
Widget _widgetForRoute(String route) {
switch (route) {
case 'route1':
return MyHomePage(title: 'Flutter Demo Home Page1');
case 'route2':
return MyHomePage(title: 'Flutter Demo Home Page2');
default:
return MyHomePage(title: 'Flutter Demo Home Page2');
}
}
然后在當(dāng)前Activity的OnCreate方法中,執(zhí)行:
FlutterView flutterView = Flutter.createView(this, getLifecycle(), "route1");
setContentView(flutterView);
//或者:
setContentView(R.layout.activity_flutter);
rlContainer = findViewById(R.id.rl_container);
rlContainer.addView(flutterView)
集成到現(xiàn)有項目遇到的坑
Check failed: vm. Must be able to initialize the VM:
E/flutter: [ERROR:flutter/runtime/dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
[ERROR:flutter/runtime/dart_vm.cc(241)] Could not setup VM data to bootstrap the VM from.
[ERROR:flutter/runtime/dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
A/flutter: [FATAL:flutter/shell/common/shell.cc(218)] Check failed: vm. Must be able to initialize the VM.
SIGABRT
0x146b
#00 pc 0002210c /system/lib/libc.so (tgkill+12) [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
#01 pc 00013165 /system/lib/libc.so (pthread_kill+48) [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
#02 pc 00013379 /system/lib/libc.so (raise+10) [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
#03 pc 000120a3 /system/lib/libc.so [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
#04 pc 000219c0 /system/lib/libc.so (abort+4) [armeabi-v7a::ac712d92afdda143205c7d7c8befc336]
#05 pc 00af85ab /data/app-lib/xxx.debug-1/libflutter.so [armeabi-v7a::a12434e0b53806a35730000001000000]
經(jīng)github上#24679及其他issue參考泛豪,得出以下解決方案:
Import flutter module to your HOST app(set binding, implementation, and instantiate view/fragment)
When you clean/rebuild from HOST app, flutter module does not generate properly
You need to open your flutter module in a separate AS
flutter clean
cd .android
./gradlew clean
./gradlew assembleDebug
Return to host app and run app(do not sync or rebuild) :)
翻譯過來就是:
本項目執(zhí)行清理命令稠诲。./gradlew clean
進(jìn)入 flutter module 項目執(zhí)行清理命令。flutter packages get;flutter clean
進(jìn)入 flutter module 的 .android 項目執(zhí)行清理命令和打包操作诡曙。./gradlew clean;./gradlew assemble
回到本項目執(zhí)行打包命令臀叙。./gradlew assemble
直接執(zhí)行下面命令即可:
$ ./gradlew clean;cd ../flutter_module;flutter packages get;flutter clean;cd .android/;./gradlew clean;./gradlew assemble;cd /d/workspace/app_proj/;./gradlew installDebug
后續(xù)假設(shè)你 flutter module 沒有更新過,那么以后修改本地項目之后价卤,就直接執(zhí)行./gradlew installDebug劝萤。 注意不要用studio工具運(yùn)行、rebuild或clean慎璧。
flutter_assets
assets下缺少flutter_assets也有可能造成此問題床嫌。具體可以參考:http://www.reibang.com/p/2d0bba84e57e
混淆
按照上述方式,debug版本沒問題炸卑,release卻報錯既鞠。需加以下混淆:
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.* { *; }
-keep class io.flutter.util.* { *; }
-keep class io.flutter.view.* { *; }
-keep class io.flutter.* { *; }
-keep class io.flutter.plugins.* { *; }
-keep class myapp.flutter.*
參考資料
https://github.com/chinaltz/FlutterDemo
https://juejin.im/post/5c74dbeee51d45708f2a20c6
https://github.com/flutter/flutter/issues/24679
https://github.com/flutter/flutter/issues/25147
https://mp.weixin.qq.com/s/OGbH3G3wHVTUt-0EJit8RA