Flutter Application 转 Module 嵌入原生 App

将Flutter Application 转 Module 嵌入原生 App

现有的 Flutter 是一个 Applicaiton 项目; 现在想他把嵌入 原生应用中:

首先需要将现有 Flutter 工程 转成  Module 工程:

在flutter 工程中 pubspec.yaml 文件中

flutter 节点下添加如下配置:然后 pug get 跑一下

  module:
    androidX: true
    androidPackage: com.john.fluttergbm
    iosBundleIdentifier: com.john.fluttergbm

pub get 一下就会生成: .android  和  .ios 文件夹;这两个文件 是flutter applicaiton 没有的;而且在 mac上是两个  隐藏文件夹;window 是可见的

在 Android 项目中:

编辑 setting.gradle 文件;添加如下

方法一

setBinding(new Binding([gradle:this]))
evaluate(new File(
        settingsDir.parentFile,
        '../gbm_flutter/GBM_Flutter/.android/include_flutter.groovy'
))

//可选,主要作用是可以在当前AS的Project下显示flutter_module以方便查看和编写Dart代码
//include ':GBM_Flutter'
//project(':GBM_Flutter').projectDir = new File('../flutter_module')

第二种方法:

 然后选择 flutter module 也是一样的

 导入成功长这样:项目使用的插件也一并导入

然后我们写一个   ActivityFlutterContent  继承 FlutterActivity

package com.john.spawn;
import io.flutter.embedding.android.FlutterActivity;

public class ActivityFlutterContent  extends FlutterActivity {
}

并且在 AndroidManifest.xml 中注册 刚刚创建的  activity ;

以及    io.flutter.embedding.android.FlutterActivity

还有相应权限的配置

<activity android:name=".ActivityFlutterContent"></activity>
<activity android:name="io.flutter.embedding.android.FlutterActivity"></activity>

完整 xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.john.spawn">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Spawn">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ActivityFlutterContent"></activity>
        <activity android:name="io.flutter.embedding.android.FlutterActivity"></activity>
    </application>

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


</manifest>

在:  MainActivity 中直接启动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //不不緩存 直接打開;每次都是新的 實例;有點可疑傳參
//        startActivity(
//                ActivityFlutterContent
//                        .withNewEngine()
//                        .initialRoute("{name:'devio',dataList:['aa','bb','bb']}")//传递的参数
//                        .build(MainActivity.this)
//        );
        startActivity(ActivityFlutterContent.createDefaultIntent(MainActivity.this));
    }

}

其余 Android 和 Flutter 详细交互 请看我的另一篇文章https://blog.csdn.net/nicepainkiller/article/details/121393646?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/nicepainkiller/article/details/123551002