
Flutter和Android
【前言】
1:先簡單的介紹下Flutter,它是一款跨平台應用SDK,高性能跨平台實現方案(暫時討論iOS和Android),
它不同於RN,少了像RN的JS中間橋接層,所以它的性能相比RN有了很好的提升。
2:Flutter從谷歌推出以來,我就開始關注,到現在3.0以上的版本,SDK也逐步穩定,目前我們的網約車項目也開始集成Flutter組件,並且效果不錯。
3:Flutter弊端也是很明顯,目前支持移動端的第三方框架可選性還不多。
對於iOS和Android來說,使用Flutter開發一套完整的APP,還是需要了解兩端的開發知識,所以使用Flutter,還得並行學習提高跨平台技能。
4:對於Flutter跨平台實現方案,目前我整理了2套可行方案:
(1):全部使用Flutter框架,包括核心功能部分,缺點未知風險可能比較多,不做優先選擇。
(2):核心功能使用原生,其他功能使用原生與Flutter交互,優點是風險最小並可控,也是最好選擇方案。當然對於跨平台開發者的跨平台技能要求較高。
【跨平台選擇】
1:我們項目中目前使用原生與Flutter交互,實現的跨平台方案,所以本文主要介紹‘原生與Flutter’集成和交互功能(暫時討論iOS和Android)。
2:之前公司有過一次Flutter的技術分享會,相關資料和項目實踐資料都有整理過,因為開發需求一直比較多,所以拖到今天才在博客上分享和大家一起研究。
3:Flutter環境的配置和安裝本文就不講了,最全面的教程可以去官網找。
【Android原生集成Flutter】
注意:Android原生集成Flutter方案已經又更新,所以原來的操作已經行不通了,下面的是新版方案。
使用 .gradle 把 Flutter 模塊集成到工程中,步驟如下:
(1):生成的Flutter工程(或者是git上下載的Flutter工程)放在與Android原工程同級目錄, 如下:(紅色部分為flutter項目名稱)
---指定目錄,創建Flutter工程(生成指令:flutter create -t module flutter_module_test),放在與Android原工程同級目錄:

(2):使用gradle,把 Flutter 工程集成到Android項目環境中
打開 AndroidApp/settings.gradle,增加如下配置:
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir.parentFile,
"flutter_module_test/.android/include_flutter.groovy"
))
然后Sync一下,
,Flutter項目已經集成進來了。
(3):然后,在項目的app目錄下,build.gradle文件中,添加如下dependency:
implementation project(':flutter')

然后Sync一下,集成 Flutter框架。
(4):運行報錯處理 - 1
如果遇到集成Flutter項目報錯,確認下 Flutter 項目下 android 文件中 include_flutter.groovy 文件是否存在,如圖:
,核心文件不能少。
缺少解決方案:重新創建flutter項目或者從別的地方拷貝一個文件放到對應目錄,然后Android執行Sync一下。
(5):運行報錯處理 - 2
整體配置就這么簡單,但是運行的時候的時候,項目掛了,出現了以下錯誤
-
錯誤: 程序包android.support.annotation不存在
-
錯誤: 找不到符號
-
符號: 類 Fragment
-
錯誤: 找不到符號
-
符號: 類 NonNull
-
位置: 類 FlutterFragment
-
錯誤: 方法不會覆蓋或實現超類型的方法
-
錯誤: 找不到符號
-
符號: 方法 getArguments()
-
位置: 類 FlutterFragment
-
錯誤: 方法不會覆蓋或實現超類型的方法
-
錯誤: 方法不會覆蓋或實現超類型的方法
查看編譯后的源碼,確實 flutter_module 中一些依賴包不存在

google 一番之后發現是 Android 包管理機制的問題,如果我們在安裝 Android Studio 的時候勾選了 Androidx,會默認使用 androidx 管理, 如圖
對於這個,解決方案有:
1:下載Android Studio重新安裝,這種比較麻煩
2:全局修改配置,借助 Android Studio 工具實現代碼 遷移,但是這些步驟還是不能解決我的問題,我的flutter_module 包依舊有一些舊的引用代碼形式,
仔細分析,我的 flutter_module 是通過 flutter create -t module 這種方式實現的,可能是這種命令生成的代碼是舊的包管理機制,
猜想有沒有生成 androidx 機制的呢,Google 之后,發現真的有
-
flutter create --androidx -t module flutter_module 重新生成項目,移代碼
(6):運行報錯處理 - 3
Invoke-customs are only supported starting with Android O (--min-api 26)
解決方案:添加版本控制
添加目錄:app -> build.grade -> android{ 此處添加 }
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
(7):完成上面步驟,Android執行Sync指令,flutter項目集成到Android原生項目中的就完成了。
每次fluter項目中代碼有改動(我使用的VSCode開發fluter),Android只要通過終端Sync指令,就能同步fluter的最新代碼到IDE中。
【Android 跳轉指定 Flutter 頁面和交互】
---實現方案:通過創建Activity,通過創建添加 FlutterFragment,FlutterFragment由channel發送信號判斷類型實現:
(1):Android 跳轉指定 Flutter 頁面實現
使用FlutterFragment
新版本的FlutterSDK不再支持已經沒有Flutter類,不再支持諸如Flutter.createView()、Flutter.createFragment()等用法,
通過閱讀其源碼我們可以找到FlutterFragment的新用法,代碼如下:
public class MyFlutterActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.flutter_layout); // 處理打開對應 Flutter界面 FlutterFragment fragment=FlutterFragment.withNewEngine().initialRoute("page_home").build(); getSupportFragmentManager().beginTransaction().add(R.id.flutter_container, fragment).commit(); } }
注:Activity:需要繼承 FragmentActivity,page_home:為跳轉Flutter頁面類型參數,
R.id.flutter_container:為 fragment 容器。
(2):flutter判斷來自Android的跳轉目標實現(Dart代碼演示)
void main(){ //flutter主入口
(3):flutter主動交互Android(Dart代碼演示)
class HomePage extends StatefulWidget {
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
static const EventChannel eventChannel = const EventChannel('com.pages.your/native_post'); //注冊一個信號通道
void _onEvent(Object event) { // Android 交互回調,返回值FlutterError為nill,執行此方法。FlutterError是什么數據,情況下面。
// Android 交互成功
}
void _onError(Object error) { // Android 交互回調,返回值FlutterError有值,執行此方法
// Android 交互失敗
}
}
(4):Android 接送處理來自flutter的交互
【Android and Flutter結語】

人生就像美麗的花朵
1:谷歌推出Flutter時間大概一年左右,版本也一直在更新和推進,所以與原生的集成和交互也一直在更新,這就需要我們時刻保持學習狀態,動態更新技能。
2:Android 和 Flutter的交互方式,並非就上面我分享的一種,也有其他的方式,相比而言,我的方案還是比較簡潔和實用。
3:作為一個移動端專業開發者,我們應該保持對新技術的熱情,跨平台方案離我們已經不再遙遠,相信未來會普及和更加完善。
4:如果技術上有不同看法或者新的技術,歡迎聯系一起討論,本人QQ: 497609288。
