将Flutter页面添加到Android

将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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值