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引擎`
public class FlutterTools {
public static final String ENGINE_ID = "default_engine_id";
private static final String METHOD_CHANNEL = "com.basic.message.channel";
private static FlutterEngine sFlutterEngine;
private static BasicMessageChannel basicMessageChannel;
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);
basicMessageChannel.setMessageHandler((message, reply) -> {
String messageStr = (String) message;
if (message != null) {
NativeFlutterEntity flutterEntity = JsonUtil.getBeanFromJsonStr(messageStr, NativeFlutterEntity.class);
dealFlutterMessage(context,flutterEntity,reply);
}
});
}
}
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);
}
}
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
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;
}
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)
.putExtra(EXTRA_DESTROY_ENGINE_WITH_ACTIVITY, false);
context.startActivity(intent);
}
@Override
public void onFlutterUiDisplayed() {
super.onFlutterUiDisplayed();
String route = getIntent().getStringExtra(EXTRA_ROUTE);
FlutterTools.setDataToFlutter(route);
}
@Override
public void onFlutterUiNoLongerDisplayed() {
super.onFlutterUiNoLongerDisplayed();
}
}
<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 {
return await sendMessage(data);
}
@override
void initState() {
super.initState();
FlutterToNative.receiveData((message) async {
_handleInitRouteMethodCall(message);
});
}
void _handleInitRouteMethodCall(String routeUrl) async {
switch (routeUrl) {
case '/authorityPage':
_initRoute = AuthorityPage();
break;
case '/HomePage':
_initRoute = HomePage();
break;
default:
_initRoute = WelcomePage();
break;
}
setState(() {});
}