代码拉取完成,页面将自动刷新
Android 与 Flutter混合开发集成Android端集成步骤
git init
git remote add origin "https://gitee.com/cj123195/MyFlutterAar.git"
git add .
git commit -m "init"
git pull
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'
}
PageRouter.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<String, String> pageName = new HashMap<String, String>() {{
//这几个都是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;
}
}
}
MyAppliction.java
:
@Override
public void onCreate() {
super.onCreate();
// 注册Router
INativeRouter router = new INativeRouter() {
@Override
public void openContainer(Context context, String url, Map<String, Object> urlParams, int requestCode, Map<String, Object> 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 版本设置
//
// <meta-data android:name="flutterEmbedding"
// android:value="2">
// </meta-data>
// 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);
}
AndroidManifest.xml
:
// 添加FlutterActivity
<activity
android:name="com.idlefish.flutterboost.containers.BoostFlutterActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
android:hardwareAccelerated="true"
android:theme="@style/Theme.AppCompat"
android:windowSoftInputMode="adjustResize">
</activity>
//flutterEmbedding 版本设置,GeneratedPluginRegistrant会自动生成新的插件方式
<meta-data
android:name="flutterEmbedding"
android:value="2"></meta-data>
@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);
}
}
这里假设读者没有Android开发经验,会Android开发的朋友可以忽略,Fragment
是一个片段,依赖于 Activity
,我们可以在一个Activity
嵌入多个Fragment
,具体的工作方式可查看文档,这里不做介绍,本项目页包含一个FlutterFragmentPageActivity
页面,可自行运行查看效果。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。