android调用flutter页面,flutter android 开发笔记(四.根据路由进入不同的flutter页面)...

如果一个页面有多个flutterView或者不同activity加载不同flutterView,需要设置不同标识作为flutter的路由表,不同路由标识加载不同的flutterview

关键代码:

//java代码

mFlutter2Engine = new FlutterEngine(this);

mFlutter2Engine.getNavigationChannel().setInitialRoute("route2");//设置加载的flutterView的路由标识

mFlutter1Engine = new FlutterEngine(this);

mFlutter1Engine.getNavigationChannel().setInitialRoute("route1");//设置加载的flutterView的路由标识

//flutter入口代码,通过路由标识,加载不同的布局

void main() {

var defaultRouteName = window.defaultRouteName;

if("route1" == defaultRouteName){

runApp(new MaterialApp(

title: "route1",

home: new Scaffold(

appBar: new AppBar(

title: new Text("route1"),

),

body: new HomeApp(),

),

));

} else if("route2" == defaultRouteName){

runApp(MyApp());

}else{

runApp(new Container(

child: new Text("default"),

));

}

}

Flutter1Activity.java代码

package xyz.djytest.flutter_test_native_project;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.ViewGroup;

import android.widget.Button;

import android.widget.FrameLayout;

import androidx.annotation.Nullable;

import androidx.appcompat.app.AppCompatActivity;

import io.flutter.embedding.android.FlutterView;

import io.flutter.embedding.engine.FlutterEngine;

import io.flutter.embedding.engine.FlutterEngineCache;

import io.flutter.embedding.engine.dart.DartExecutor;

import io.flutter.embedding.engine.renderer.FlutterUiDisplayListener;

import io.flutter.plugin.common.MethodCall;

import io.flutter.plugin.common.MethodChannel;

public class Flutter1Activity extends AppCompatActivity {

FlutterEngine mFlutter1Engine;

FlutterView mFlutter1View;

MethodChannel mFlutter1MethodChannel1;

String flutter1Name = "default is null";

Button mButton1,mButton2;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 通过FlutterView引入Flutter编写的页面

setContentView(R.layout.activity_flutter1);

initFlutterEngine();

mFlutter1View = createFlutterView();

mButton1 = findViewById(R.id.button1);

mButton1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (mFlutter1MethodChannel1!=null){

Log.d("TAG","mButton1 java 调用 flutter");

mFlutter1MethodChannel1.invokeMethod("getFlutterName", flutter1Name, new MethodChannel.Result() {

@Override

public void success(Object result) {

flutter1Name = (String) result;

mButton1.setText(flutter1Name);

}

@Override

public void error(String errorCode, String errorMessage, Object errorDetails) {

Log.d("TAG","errorCode = "+ errorCode + ",errorMessage = "+errorMessage);

}

@Override

public void notImplemented() {

Log.d("TAG","flutter 端没有实现 getFlutterName");

}

});

}

}

});

mButton2 = findViewById(R.id.checkFlutterMap);

mButton2.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (mFlutter1MethodChannel1!=null){

Log.d("TAG","mButton2 java 调用 flutter");

mFlutter1MethodChannel1.invokeMethod("checkFlutterMap", null, new MethodChannel.Result() {

@Override

public void success(Object result) {

String flutterMapStr = (String) result;

Log.d("TAG","flutterMapStr = "+ flutterMapStr);

}

@Override

public void error(String errorCode, String errorMessage, Object errorDetails) {

Log.d("TAG","errorCode = "+ errorCode + ",errorMessage = "+errorMessage);

}

@Override

public void notImplemented() {

Log.d("TAG","flutter 端没有实现 checkFlutterMap");

}

});

}

}

});

// 关键代码,将Flutter页面显示到FlutterView中

mFlutter1View.attachToFlutterEngine(mFlutter1Engine);

}

private FlutterView createFlutterView() {

FlutterView flutterView = new FlutterView(this);

FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.MATCH_PARENT);

FrameLayout flContainer = findViewById(R.id.fl_flutter);

flContainer.addView(flutterView, lp);

flContainer.setVisibility(View.INVISIBLE);

FlutterUiDisplayListener listener = new FlutterUiDisplayListener() {

@Override

public void onFlutterUiDisplayed() {

flContainer.setVisibility(View.VISIBLE);

}

@Override

public void onFlutterUiNoLongerDisplayed() {

}

};

flutterView.addOnFirstFrameRenderedListener(listener);

return flutterView;

}

private void initFlutterEngine() {

mFlutter1Engine = FlutterEngineCache.getInstance().get("flutter1");

if (mFlutter1Engine == null){

mFlutter1Engine = new FlutterEngine(this);

mFlutter1Engine.getNavigationChannel().setInitialRoute("route1");

initChannel(mFlutter1Engine);

mFlutter1Engine.getDartExecutor().executeDartEntrypoint(

DartExecutor.DartEntrypoint.createDefault()

);

FlutterEngineCache.getInstance().put("flutter1", mFlutter1Engine);

}

}

private void initChannel(FlutterEngine flutterEngine) {

mFlutter1MethodChannel1 = new MethodChannel(flutterEngine.getDartExecutor(), "flutter1/flutter2Java");

mFlutter1MethodChannel1.setMethodCallHandler(new MethodChannel.MethodCallHandler() {

@Override

public void onMethodCall(MethodCall call, MethodChannel.Result result) {

if (call == null || result == null){

if (result!=null){

result.error("-1","MethodCall is null",new Exception("MethodCall is null"));

}

return;

}

if ("getInt".equals(call.method)){

result.success(Integer.MAX_VALUE);

}if ("getLong".equals(call.method)){

result.success(Long.MAX_VALUE);

}else {

result.notImplemented();

}

}

});

}

@Override

protected void onResume() {

super.onResume();

mFlutter1Engine.getLifecycleChannel().appIsResumed();

}

@Override

protected void onStart() {

super.onStart();

}

@Override

protected void onRestart() {

super.onRestart();

}

@Override

protected void onPause() {

super.onPause();

mFlutter1Engine.getLifecycleChannel().appIsInactive();

}

@Override

protected void onStop() {

super.onStop();

mFlutter1Engine.getLifecycleChannel().appIsPaused();

}

@Override

protected void onDestroy() {

super.onDestroy();

FlutterEngineCache.getInstance().remove("flutter1");

mFlutter1Engine.destroy();

mFlutter1Engine = null;

mFlutter1View = null;

mFlutter1MethodChannel1 = null;

}

@Override

public void onBackPressed() {

super.onBackPressed();

finish();

}

}

Flutter2Activity.java代码

package xyz.djytest.flutter_test_native_project;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.Button;

import android.widget.FrameLayout;

import androidx.appcompat.app.AppCompatActivity;

import io.flutter.embedding.android.FlutterView;

import io.flutter.embedding.engine.FlutterEngine;

import io.flutter.embedding.engine.FlutterEngineCache;

import io.flutter.embedding.engine.dart.DartExecutor;

import io.flutter.embedding.engine.renderer.FlutterUiDisplayListener;

import io.flutter.plugin.common.MethodCall;

import io.flutter.plugin.common.MethodChannel;

import io.flutter.view.FlutterMain;

public class Flutter2Activity extends AppCompatActivity {

FlutterEngine mFlutter2Engine;

FlutterView mFlutter2View;

MethodChannel mFlutter2MethodChannel;

Button mButton;

@Override

protected void onCreate(Bundle savedInstanceState) {

FlutterMain.startInitialization(this);

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_flutter2);

mButton = findViewById(R.id.button1);

mButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (mFlutter2MethodChannel != null) {

mFlutter2MethodChannel.invokeMethod("getFlutterMethod", null, new MethodChannel.Result() {

@Override

public void success(Object result) {

if (result != null) {

String str = result.toString();

mButton.setText(str);

}

}

@Override

public void error(String errorCode, String errorMessage, Object errorDetails) {

}

@Override

public void notImplemented() {

}

});

}

}

});

initFlutterEngine();

mFlutter2View = createFlutterView();

mFlutter2View.attachToFlutterEngine(mFlutter2Engine);

}

private FlutterView createFlutterView() {

FlutterView flutterView = new FlutterView(this);

FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.MATCH_PARENT);

FrameLayout flContainer = findViewById(R.id.fl_flutter);

flContainer.addView(flutterView, lp);

flContainer.setVisibility(View.INVISIBLE);

FlutterUiDisplayListener listener = new FlutterUiDisplayListener() {

@Override

public void onFlutterUiDisplayed() {

flContainer.setVisibility(View.VISIBLE);

}

@Override

public void onFlutterUiNoLongerDisplayed() {

}

};

flutterView.addOnFirstFrameRenderedListener(listener);

return flutterView;

}

private void initFlutterEngine() {

mFlutter2Engine = FlutterEngineCache.getInstance().get("flutter2");

if (mFlutter2Engine == null) {

mFlutter2Engine = new FlutterEngine(this);

mFlutter2Engine.getNavigationChannel().setInitialRoute("route2");

initChannel(mFlutter2Engine);

mFlutter2Engine.getDartExecutor().executeDartEntrypoint(

DartExecutor.DartEntrypoint.createDefault()

);

FlutterEngineCache.getInstance().put("flutter2", mFlutter2Engine);

}

}

private void initChannel(FlutterEngine flutter2Engine) {

mFlutter2MethodChannel = new MethodChannel(flutter2Engine.getDartExecutor(), "flutter2/flutter2Java");

mFlutter2MethodChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {

@Override

public void onMethodCall(MethodCall call, MethodChannel.Result result) {

if (call == null || result == null) {

if (result != null) {

result.error("-1", "MethodCall is null", new Exception("MethodCall is null"));

}

return;

}

if ("getJavaMethod".equals(call.method)) {

result.success("success ");

} else {

result.success(" unKnow method");

}

}

});

}

@Override

protected void onResume() {

super.onResume();

mFlutter2Engine.getLifecycleChannel().appIsResumed();

}

@Override

protected void onStart() {

super.onStart();

}

@Override

protected void onRestart() {

super.onRestart();

}

@Override

protected void onPause() {

super.onPause();

mFlutter2Engine.getLifecycleChannel().appIsInactive();

}

@Override

protected void onStop() {

super.onStop();

mFlutter2Engine.getLifecycleChannel().appIsPaused();

}

@Override

protected void onDestroy() {

super.onDestroy();

FlutterEngineCache.getInstance().remove("flutter2");

mFlutter2Engine.destroy();

mFlutter2Engine = null;

mFlutter2View = null;

mFlutter2MethodChannel = null;

}

@Override

public void onBackPressed() {

super.onBackPressed();

finish();

}

}

原文:https://www.cnblogs.com/fengchuxiaodai/p/13100953.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值