# android_flutter_mixed **Repository Path**: cj123195/android_flutter_mixed ## Basic Information - **Project Name**: android_flutter_mixed - **Description**: Android Flutter集成demo - **Primary Language**: Android - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-07 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ios_flutter_mixed ### 介绍 Android 与 Flutter混合开发集成Android端集成步骤 - #### 引入 aar - ##### 在Android项目 `app` 目录下创建文件夹命名为 `libs` ![](/Users/caojun/Desktop/boostnote_images/android_mulu.png) - ##### 打开终端,切换到`libs`目录下,执行命令: ``` git init git remote add origin "https://gitee.com/cj123195/MyFlutterAar.git" git add . git commit -m "init" git pull ``` - ##### 修改`app`目录下的 `build.gradle` 文件, 添加如下代码: ``` android { // ... } repositories { maven { url '../libs' } maven { url 'https://storage.googleapis.com/download.flutter.io' } } dependencies { // ... debugImplementation 'com.example.fluttermodule:flutter_debug:1.0' profileImplementation 'com.example.fluttermodule:flutter_profile:1.0' releaseImplementation 'com.example.fluttermodule:flutter_release:1.0' } ``` - ##### Sync 同步 `build.gradle` - #### 使用 aar - ##### 创建原生Router,本项目命名为`PageRouter` `PageRouter.java`: ```java package com.example.androiddemo; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.util.Log; import com.idlefish.flutterboost.containers.BoostFlutterActivity; import java.util.HashMap; import java.util.Map; public class PageRouter { public final static Map pageName = new HashMap() {{ //这几个都是flutter页面 put("first", "first"); put("second", "second"); put("tab", "tab"); }}; public static final String NATIVE_PAGE_URL = "sample://nativePage"; // native 页面路径前缀 public static final String FLUTTER_PAGE_URL = "sample://flutterPage"; // flutter 页面路径前缀 public static final String FLUTTER_FRAGMENT_PAGE_URL = "sample://flutterFragmentPage"; // flutterFragment 路径前缀 public static boolean openPageByUrl(Context context, String url, Map params) { return openPageByUrl(context, url, params, 0); } /* * @param url: 打开页面的路径 * @param params: 传递的参数 * @param requestCode: 请求的代码 * */ public static boolean openPageByUrl(Context context, String url, Map params, int requestCode) { Log.d(MyApplication.TAG,"openPageByUrl url:"+url+"\tparams:"+params+"\trequestCode:"+requestCode); try { if (url.startsWith(FLUTTER_PAGE_URL)) { //打开flutter页面 String path = url.split("\\?")[1]; Intent intent = BoostFlutterActivity.withNewEngine().url(pageName.get(path)).params(params) .backgroundMode(BoostFlutterActivity.BackgroundMode.opaque).build(context); if(context instanceof Activity){ Activity activity=(Activity)context; activity.startActivityForResult(intent,requestCode); }else{ context.startActivity(intent); } return true; } else if (url.startsWith(FLUTTER_FRAGMENT_PAGE_URL)) { //打开flutter fragment context.startActivity(new Intent(context, FlutterFragmentPageActivity.class)); return true; } else if (url.startsWith(NATIVE_PAGE_URL)) { // 打开 Native 页面 context.startActivity(new Intent(context, NativePageActivity.class)); return true; } return false; } catch (Throwable t) { return false; } } } ``` - ##### 在入口文件 `onCreate` 方法中初始化 FlutterBoost,本项目入口文件为`MyApplication.java` `MyAppliction.java`: ```java @Override public void onCreate() { super.onCreate(); // 注册Router INativeRouter router = new INativeRouter() { @Override public void openContainer(Context context, String url, Map urlParams, int requestCode, Map exts) { Log.d(TAG,"openContainer url:"+url+"\turlParams:"+urlParams+"\trequestCode:"+requestCode+"\texts:"+exts); String assembleUrl = Utils.assembleUrl(url, urlParams); PageRouter.openPageByUrl(context, assembleUrl, urlParams); } }; // 添加监听 FlutterBoost.BoostLifecycleListener boostLifecycleListener = new FlutterBoost.BoostLifecycleListener() { @Override public void beforeCreateEngine() { Log.d(TAG,"beforeCreateEngine"); } @Override public void onEngineCreated() { Log.d(TAG,"onEngineCreated"); } @Override public void onPluginsRegistered() { Log.d(TAG,"onPluginsRegistered"); } @Override public void onEngineDestroy() { Log.d(TAG,"onEngineDestroy"); } }; // // AndroidManifest.xml 中必须要添加 flutterEmbedding 版本设置 // // // // GeneratedPluginRegistrant 会自动生成 新的插件方式  // // Platform platform = new FlutterBoost .ConfigBuilder(this, router) .isDebug(true) .whenEngineStart(FlutterBoost.ConfigBuilder.ANY_ACTIVITY_CREATED) .renderMode(FlutterView.RenderMode.texture) .lifecycleListener(boostLifecycleListener) .build(); FlutterBoost.instance().init(platform); } ``` - ##### 修改 `app/src/main/AndroidManifest.xml`,添加如下代码 `AndroidManifest.xml`: ```xml // 添加FlutterActivity //flutterEmbedding 版本设置,GeneratedPluginRegistrant会自动生成新的插件方式  ``` - ##### 页面跳转 ```java @Override public void onClick(View v) { Log.d(MyApplication.TAG,"onClick"); Map params = new HashMap(); params.put("test1","v_test1"); params.put("test2","v_test2"); //Add some params if needed. if (v == mOpenNative) { PageRouter.openPageByUrl(this, PageRouter.NATIVE_PAGE_URL , params); } else if (v == mOpenFlutter) { PageRouter.openPageByUrl(this, PageRouter.FLUTTER_PAGE_URL+"?first",params); } else if (v == mOpenFlutterFragment) { PageRouter.openPageByUrl(this, PageRouter.FLUTTER_FRAGMENT_PAGE_URL,params); } } ``` - #### 使用Fragment方式打开Flutter页面 这里假设读者没有Android开发经验,会Android开发的朋友可以忽略,`Fragment`是一个片段,依赖于 `Activity`,我们可以在一个`Activity`嵌入多个`Fragment`,具体的工作方式可查看文档,这里不做介绍,本项目页包含一个`FlutterFragmentPageActivity`页面,可自行运行查看效果。 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request