Android原生项目接入Flutter module
1.在settings.gradle中接入Flutter module
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir.parentFile,
'../Flutter/flutter_module/.android/include_flutter.groovy'
))
复制代码
2.在app的build.gradle中`
//集成Flutter项目
implementation project(':flutter')
复制代码
3.创建flutter引擎`
/**
* @Description: 启动引擎、发送消息和接受消息工具类
* @Version: 1.0
* @Author: samson
* @Date: 2021/7/23 10:52
*/
public class FlutterTools {
public static final String ENGINE_ID = "default_engine_id";
private static final String METHOD_CHANNEL = "com.basic.message.channel";
//flutter引擎
private static FlutterEngine sFlutterEngine;
//消息通道
private static BasicMessageChannel basicMessageChannel;
/**
* 加载flutter引擎
*
* @param context
*/
public static void preWarmFlutterEngine(Context context) {
if (null == sFlutterEngine) {
sFlutterEngine = new FlutterEngine(context);
sFlutterEngine.getDartExecutor().executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
);
basicMessageChannel = new BasicMessageChannel(sFlutterEngine.getDartExecutor(), METHOD_CHANNEL, StandardMessageCodec.INSTANCE);
FlutterEngineCache.getInstance().put(ENGINE_ID, sFlutterEngine);
//接受flutter消息监听
basicMessageChannel.setMessageHandler((message, reply) -> {
//接受flutter消息,跳转到原生页面,可以根据message不同
String messageStr = (String) message;
if (message != null) {
NativeFlutterEntity flutterEntity = JsonUtil.getBeanFromJsonStr(messageStr, NativeFlutterEntity.class);
dealFlutterMessage(context,flutterEntity,reply);
}
});
}
}
/**
* 处理flutter发送过来的消息
* @param context
* @param flutterEntity
*/
private static void dealFlutterMessage(Context context, NativeFlutterEntity flutterEntity, BasicMessageChannel.Reply reply){
if("settingId".equals(flutterEntity.pageId)) {
//去设置
Intent intent = new Intent(context, SetActivity.class);
context.startActivity(intent);
}
}
/**
* 发送数据到flutter
*
* @param json
*/
public static void setDataToFlutter(String json) {
basicMessageChannel.send(json);
}
public static void clearEngine(){
if (sFlutterEngine != null) {
sFlutterEngine = null;
}
}
/**
* 销毁引擎
*/
public static void destroyEngine() {
if (sFlutterEngine != null) {
sFlutterEngine.destroy();
sFlutterEngine = null;
}
}
}
复制代码
4.创建FlutterActivity
/**
* 原生启动flutter页面
* 存在的问题:
* flutter初始化页面 返回会状态不会被重新刷新
*/
public class AndroidFlutterActivity extends FlutterActivity {
static final String EXTRA_CACHED_ENGINE_ID = "cached_engine_id";
static final String EXTRA_ROUTE = "extra_route";
static final String EXTRA_DESTROY_ENGINE_WITH_ACTIVITY = "destroy_engine_with_activity";
public static Activity mActivity;
private BroadcastReceiver broadcastReceiver;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = this;
}
/**
* 打开flutter跳转页面
* @param context
* @param route
*/
public static void open(Context context, String route) {
Intent intent = new Intent(context, AndroidFlutterActivity.class)
.putExtra(EXTRA_CACHED_ENGINE_ID, "default_engine_id")
.putExtra(EXTRA_ROUTE, route)
// Activity 销毁时保留 FlutterEngine
.putExtra(EXTRA_DESTROY_ENGINE_WITH_ACTIVITY, false);
context.startActivity(intent);
}
/**
* 加载flutterView
*/
@Override
public void onFlutterUiDisplayed() {
super.onFlutterUiDisplayed();
// 设置 Flutter 界面入口,注意不要在 onCreate 方法中调用,否则
// Flutter 入口不会更新。
String route = getIntent().getStringExtra(EXTRA_ROUTE);
//发送路由消息到flutter页面
FlutterTools.setDataToFlutter(route);
}
@Override
public void onFlutterUiNoLongerDisplayed() {
super.onFlutterUiNoLongerDisplayed();
}
}
复制代码
<!-- Android跳转flutter -->
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:theme="@style/FlutterPageTheme"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".flutter.AndroidFlutterActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@style/FlutterPageTheme"
tools:ignore="LockedOrientationActivity" />
复制代码
5.在flutter module中
//信息通道
static late BasicMessageChannel messageChannel;
///初始化
static init() {
messageChannel = const BasicMessageChannel(
"com.basic.message.channel", StandardMessageCodec());
}
/// 发送数据到原生
static Future<dynamic> sendData(
{required String data}) async {
//最好使用json格式传递数据
return await sendMessage(data);
}
@override
void initState() {
super.initState();
// 设置 MethodCallHandler 接收来自 Android 的消息
FlutterToNative.receiveData((message) async {
_handleInitRouteMethodCall(message);
});
}
//根据传入的url打开不同的页面
void _handleInitRouteMethodCall(String routeUrl) async {
switch (routeUrl) {
case '/authorityPage':
_initRoute = AuthorityPage();
break;
case '/HomePage':
_initRoute = HomePage();
break;
default:
_initRoute = WelcomePage();
break;
}
/// 更新界面
setState(() {});
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END