安卓原生工程整合Flutter工程

程式園中猿 發表於 2019-10-11

一、建立安卓和Flutter工程

  1. 建立安卓原生工程(語言選擇為Kotlin,工程命名為:android_demo)

    安卓原生工程整合Flutter工程

  2. 建立Flutter工程(下面是採用IntelliJ IDEA建立的,語言選擇為Kotlin/Swift,工程命名為:flutter_demo)

    安卓原生工程整合Flutter工程

二、修改Flutter工程

  1. 在Flutter工程下,編輯android/app/build.gradle
  • 將工程改為library工程
apply plugin: 'com.android.application'
複製程式碼

改為

apply plugin: 'com.android.library'
複製程式碼
  • 刪除android節點下defaultConfig下面的applicationId配置 最終程式碼(關鍵程式碼節選):
apply plugin: 'com.android.library'
...
android {
    ...
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
...
}
複製程式碼
  1. 在Flutter工程下,開啟android/app/src/main/AndroidManifest.xml檔案
  • 刪除application標籤裡面的屬性;
  • 將activity的路徑修改為完整路徑;
  • 刪除intent-filter節點.
    安卓原生工程整合Flutter工程
    最終程式碼如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.flutter_demo">
    <application>
        <activity
            android:name="com.example.flutter_demo.MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data
                android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                android:value="true" />
        </activity>
    </application>
</manifest>
複製程式碼
  1. 在Flutter工程下,修改MainActivity檔案
  • 在import程式碼中增加:
import io.flutter.view.FlutterMain
複製程式碼
  • 在onCreate方法下增加如下程式碼:
FlutterMain.startInitialization(this.applicationContext)
複製程式碼

最終程式碼如下:

import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.view.FlutterMain
class MainActivity: FlutterActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    FlutterMain.startInitialization(this.applicationContext)
    super.onCreate(savedInstanceState)
    GeneratedPluginRegistrant.registerWith(this)
  }
}
複製程式碼

三、修改安卓原生工程

  1. 開啟安卓工程下settings.gradle檔案,增加如下配置: (下面Flutter路徑必須是相對路徑,不能用絕對路徑)
include ':app', ':flutter_demo'
project(':flutter_demo').projectDir = new File(settingsDir, '../flutter_demo/android/app')
複製程式碼
  1. 在安卓工程下local.properties中,增加如下配置(可以從Flutter工程下android目錄下local.properties檔案中拷貝):
flutter.sdk=自己的flutterSDK路徑
複製程式碼
  1. 修改安卓工程下的build.gradle 檔案:
  • 在android節點下增加如下內容:
compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
複製程式碼
  • 在dependencies節點下增加依賴:
implementation project(“:flutter_demo”)
複製程式碼

最終程式碼(關鍵程式碼節選):

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation project(":flutter_demo")
    ...
}
複製程式碼
  1. 在安卓原生工程中開啟Flutter工程介面:
val componentName = ComponentName(this, "com.example.flutter_demo.MainActivity")
val intent = Intent().setComponent(componentName)
startActivity(intent)
複製程式碼
  1. 同步一下安卓原生專案,執行一下.
    安卓原生工程整合Flutter工程

demo原始碼

gitee.com/cxyzy1/andr…