将Flutter页面作为一个Activity在Android中使用
1.Activity继承 FlutterActivity
2.在onCreate中建立methodChannel
MethodChannel methodChannel;
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
methodChannel = new MethodChannel(getFlutterEngine().getDartExecutor().getBinaryMessenger(), "ChannelName");
methodChannel.setMethodCallHandler((call, result) -> {
Log.e("TAG","method = "+call.method);
//这里处理Flutter调用原生的方法
if("back".equals(call.method)){
finish();
}
});
}
3.其它Activity启动Flutter页面的Activity
public static void toFlutterPage(Context context){
Intent intent = new NewEngineIntentBuilder(FlutterCalibrationCouseActivity.class)
.withNewEngine()
.initialRoute("route name") //与Flutter main方法中定义的路由名对应
.build(context);
context.startActivity(intent);
}
4.完整代码
public class TestActivity extends FlutterActivity {
FlutterEngine flutterEngine;
MethodChannel methodChannel;
String TAG="TestActivity";
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
flutterEngine = getFlutterEngine();
methodChannel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), FlutterUtil.CHANNEL);
methodChannel.setMethodCallHandler((call, result) -> {
Log.e(TAG,"method = "+call.method);
if("back".equals(call.method)){
finish();
}
});
}
public static NewEngineIntentBuilder withNewEngine(){
return new NewEngineIntentBuilder(TestActivity.class);
}
public static void toFlutterPage(Context context){
Intent intent = TestActivity
.withNewEngine()
.initialRoute("routeName")
.build(context);
context.startActivity(intent);
}
}
5.AndroidManifest文件中进行声明
将Flutter作为一个Fragment在Android中使用
1.继承 FlutterFragment
2.onCreate中建立methodChannel
FlutterEngine flutterEngine;
MethodChannel methodChannel;
String TAG = "TestFragment";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"method = onCreate");
flutterEngine = getFlutterEngine();
methodChannel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), FlutterUtil.CHANNEL);
methodChannel.setMethodCallHandler((call, result) -> {
Log.e(TAG,"method = "+call.method);
if("BackToHome".equals(call.method)){
getActivity().finish();
}
});
}
3.建立Fragment对象供Activity调用
static FlutterFragment getFragment(){
CachedEngineFragmentBuilder builder = new CachedEngineFragmentBuilder(TestFlutterFragment.class,testCacheEngineID);
TestFlutterFragment flutterFragment = builder
.transparencyMode(io.flutter.embedding.android.TransparencyMode.transparent)
.shouldAttachEngineToActivity(true)
.build();
return flutterFragment;
}
4.Activity中添加Fragment
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
FlutterFragment fragment = TestFlutterFragment.getFragment();
transaction.add(R.id.container, fragment);
transaction.commit();
5.建立缓冲Engine
FlutterEngine testCacheEngine;
public static String testCacheEngineID = "testCacheEngineID";
public void initCacheFlutterEngine(Context context){
testCacheEngine = createEngine(context, "routeNae", testCacheEngineID);
}
public static FlutterEngine createEngine(Context context, String routeName, String engineID){
// Instantiate a FlutterEngine.
FlutterEngine flutterEngine = new FlutterEngine(context);
if(!routeName.equals("")){
// Configure an initial route.
flutterEngine.getNavigationChannel().setInitialRoute(routeName);
}
// Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.getDartExecutor().executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
);
// Cache the FlutterEngine to be used by FlutterActivity or FlutterFragment.
FlutterEngineCache
.getInstance()
.put(engineID, flutterEngine);
return flutterEngine;
}
6.完整代码
public class TestFragment extends FlutterFragment {
public FlutterMainActivity mainActivity;
FlutterEngine flutterEngine;
MethodChannel methodChannel;
String TAG = "TestFragment";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG,"method = onCreate");
flutterEngine = getFlutterEngine();
methodChannel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), FlutterUtil.CHANNEL);
methodChannel.setMethodCallHandler((call, result) -> {
Log.e(TAG,"method = "+call.method);
if("BackToHome".equals(call.method)){
getActivity().finish();
}
});
}
static FlutterFragment getFragment(){
CachedEngineFragmentBuilder builder = new CachedEngineFragmentBuilder(TestFragment.class,testCacheEngineID);
TestFragment flutterFragment = builder
.transparencyMode(io.flutter.embedding.android.TransparencyMode.transparent)
.shouldAttachEngineToActivity(true)
.build();
return flutterFragment;
}
}