Android & Flutter 相互跳转

写在前面

本文中native和flutter的跳转是借助于咸鱼的FlutterBoost和ARouter框架实现的。

  • flutterBoost
    https://github.com/alibaba/flutter_boost

一、flutterBoost的接入

  • flutter项目配置
    在pubspec.yaml输入下面配置,然后执行flutter pub get命令
dependencies:
  flutter:
    sdk: flutter
 //配置fluterBoost
  flutter_boost:
    git:
      url: 'https://github.com/alibaba/flutter_boost.git'
      ref: '7a6ee43a65b09e62e28e19bade8d941af164dd42'
  • android项目配置
    在主模块(app模块)下build.gradle输入下面内容
    implementation 'com.alibaba:arouter-api:1.4.1'
    implementation project(':flutter_boost')

Sync Now...

二、flutterBoost初始化

flutterBoost中需要给每个页面定义一个router_path,然后根据router_path找到对应页面再跳转。

  • flutter
    在main.dart中注册router_path和页面的映射关系
void main() {
  WidgetsFlutterBinding.ensureInitialized();//在flutter 1.12版本中要加上此行代码
  registerFlutterBoost();//注册路由
  runApp(MyApp());
}

 ///注册页面route的方法  flutter/demo/onePage是MyOnePage页面对应的router_path
void registerFlutterBoost() { 
//所有的跳转页面都要在这里注册
  FlutterBoost.singleton.registerPageBuilders({
    “flutter/demo/onePage”: (pageName, params, _) {
           return MyOnePage(params);
    },
  });
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        theme:
            ThemeData(brightness: Brightness.light, primaryColor: Colors.white),
        title: 'Flutter example',
        builder: FlutterBoost.init(postPush: _onRoutePushed),// 初始化flutterBoost
        home: Container());
  }

  void _onRoutePushed(
      String pageName, String uniqueId, Map params, Route route, Future _) {}
}

  • android
    在Mainifest文件中注册BoostFlutterActivity
 
        
            

        

在Application的onCreate中初始化

//MyApplication.java
 @Override
    public void onCreate() {
        super.onCreate();
        initFlutterboost(this);
    }

 public void initFlutterboost(Application application) {
        INativeRouter router = (context, url, urlParams, requestCode, exts) -> {
            //根据项目实现跳转的代码
            RouterService.getInstance().jumpFlutter(context, url, urlParams, requestCode, exts);
        };

        FlutterBoost.BoostLifecycleListener listener = new FlutterBoost.BoostLifecycleListener() {
            @Override
            public void beforeCreateEngine() {

            }

            @Override
            public void onEngineCreated() {
            }

            @Override
            public void onPluginsRegistered() {

            }

            @Override
            public void onEngineDestroy() {

            }
        };

        Platform platform = new FlutterBoost
                .ConfigBuilder(application, router)
                .isDebug(true)
                .whenEngineStart(FlutterBoost.ConfigBuilder.ANY_ACTIVITY_CREATED)
                .renderMode(FlutterView.RenderMode.surface)
                .lifecycleListener(listener)
                .build();

        FlutterBoost.instance().init(platform);
    }


RouterService.java
public void jumpFlutter(Context context, String url, Map params, int requestCode, Map exts) {
        try {
            if (url.startsWith("flutter")) {//跳转flutter页面
                Intent intent = BoostFlutterActivity.withNewEngine().url(url).params(params)
                        .backgroundMode(BoostFlutterActivity.BackgroundMode.opaque).build(context);
                if (context instanceof Activity) {
                    ((Activity) context).startActivityForResult(intent, requestCode);
                } else {
                    context.startActivity(intent);
                }
                return;
            } else {//跳转native页面
                jumpNative(context, url, params, requestCode);
            }
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

三、跳转示例代码

android jump to flutter

findViewById(R.id.tv_open_flutter).setOnClickListener(view -> {
            Map map = new HashMap();
            map.put("name", "张三");
            RouterService.getInstance().jumpFlutter(MainActivity.this, "flutter/demo/onePage", map, 10, null);
        });

flutter jump to android

//打开native页面
Future> openPage(String url,
      {Map pageParams, Map exts}) {
    return FlutterBoost.singleton.open(url, exts: exts, urlParams: pageParams);
  }

//关闭页面
Future closePage(BuildContext context,
      {Map result, Map exts}) {
    BoostContainerSettings settings = BoostContainer.of(context).settings;
    return FlutterBoost.singleton
        .close(settings.uniqueId, result: result, exts: exts);
  }

你可能感兴趣的:(Android & Flutter 相互跳转)