Flutter 79: 图解 Android Native 集成 FlutterBoost 小尝试 (二)

简介: 0 基础学习 Flutter,第七十九步:解决接入 FlutterBoost 时遇到的小问题!

      小菜前几天刚尝试接入 FlutterBoost,主要对其页面路由的跳转及传参等有了初步的认识,接下来是对日常操作的基本学习;

      FlutterBoost 作为 NativeFlutter 之间的桥接方式,两端之间的数据传递是必不可少的;FlutterBoost 也是采用同样 Platform Channel 进行桥接,最常用的就是 MethodChannel

插件注册

      小菜在使用 Flutter Module 时会根据不同的业务模块注册不同的插件,小菜以前尝试单纯采用 Flutter 时需要 FlutterMain.startInitialization 初始化,而 FlutterBoost 也不例外;但是根据 FlutterBoost 的版本迭代,其注册的方式也随着有所变更,且必不可少;

      小菜尝试的是 v1.12.13-hotfixes 版本,可以在 AndroidManifest.xml 中必须要添加 flutterEmbedding 版本设置注册插件方式,同时也可以通过 GeneratedPluginRegistrant 手动方式注册,此时均无需继承 FlutterApplication

// AndroidManifest 方式注册
<meta-data android:name="flutterEmbedding"
    android:value="2">
</meta-data>

// GeneratedPluginRegistrant 方式注册
FlutterBoost.BoostPluginsRegister pluginsRegister = new FlutterBoost.BoostPluginsRegister() {
    @Override
    public void registerPlugins(PluginRegistry mRegistry) {
        GeneratedPluginRegistrant.registerWith(FlutterBoost.instance().engineProvider());
    }
};

创建通信通道 Platform Channel

      小菜在单纯使用 Flutter 时,创建通信通道尝试通过 MethodChannel / BasicMessageChannel / EventChannel,其中初始化时均需 FlutterView,小菜接入 FlutterBoost 后在 MainActivity 中创建通信通道,监听 onMethodChannel,在 Flutter 端监听到方法是可以正常通信的;

new MethodChannel(getFlutterView(), "test.ace.com/main").setMethodCallHandler(new MethodChannel.MethodCallHandler() {
    @Override
    public void onMethodCall(MethodCall call, MethodChannel.Result result) {
        if (call.method.equals("ace_demo_user")) {
            Toast.makeText(this, "当前 method 为 ace_demo_user", Toast.LENGTH_LONG).show();
        } else {
            result.notImplemented();
        }
    }
});

      但是小菜是把 MainActivity 作为 FlutterView 来处理的,这样对于后期的维护以及业务方面的处理均不符合要求,并且据 FlutterBoost-issues 中提及在 v1.9 以后优化了创建通道的方法,在初始化 FlutterBoost 时会对 FlutterBoost LifeCycle 生命周期做监听;可在 onPluginsRegistered() 方法中进行创建;这样可以免去针对不同页面的 FlutterView 设置;

FlutterBoost.BoostLifecycleListener boostLifecycleListener = new FlutterBoost.BoostLifecycleListener() {

    @Override
    public void onEngineCreated() {

    }

    @Override
    public void onPluginsRegistered() {
        BinaryMessenger messenger = FlutterBoost.instance().engineProvider().getDartExecutor();
        initMainMethod(messenger);
    }

    @Override
    public void onEngineDestroy() {

    }
};

private void initMainMethod(BinaryMessenger messenger) {
    MethodChannel mMainChannel = new MethodChannel(messenger, "test.ace.com/main");
    mMainChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {
        @Override
        public void onMethodCall(MethodCall call, MethodChannel.Result result) {
            if (call.arguments != null) {
                Log.e("TAG", "回调内容:" + call.arguments.toString());
            }
            if (call.method != null) {
                Log.e("TAG", "回调方法:" + call.method.toString());
            }
            if (call.method.equals("ace_demo_user")) {
                result.success("");
            } else {
                result.notImplemented();
            }
        }
    });
}

监听关闭路由

      在使用 FlutterBoost 时,小菜按照官网方式封装了 openPageUrl 开启路由的方法,对于特殊页面的路由专场动画也可以单独设置,但对于关闭路由动画却不能直接设置;

      小菜分析源码,在 Platform 中提供了 closeContainer() 方法,而其中 finishContainer() 可以通过获取当前 Activity 来关闭路由;

// 源码
public void closeContainer(IContainerRecord record, Map<String, Object> result, Map<String, Object> exts) {
    if (record == null) return;
    record.getContainer().finishContainer(result);
}

@Override
public void finishContainer(Map<String, Object> result) {
    if (result != null) {
        setBoostResult(this.host.getActivity(), new HashMap<>(result));
        this.host.getActivity().finish();
    } else {
        this.host.getActivity().finish();
    }
}

      closeContainer() 该方法并非抽象方法,但 Platform 是抽象类,所以小菜直接重写 closeContainer() 即可;

Platform platform = new Platform() {
    @Override
    public Application getApplication() {
        return BaseApplication.getInstance();
    }

    @Override
    public void openContainer(Context context, String url, Map<String, Object> urlParams, int requestCode,
        Map<String, Object> exts) {
        router.openContainer(context, url, urlParams, requestCode, exts);
    }

    @Override
    public void closeContainer(IContainerRecord record, Map<String, Object> result, Map<String, Object> exts) {
        super.closeContainer(record, result, exts);
        // 获取路由 Activity 设置转场动画
    }

    @Override
    public int whenEngineStart() {
        return FlutterBoost.ConfigBuilder.ANY_ACTIVITY_CREATED;
    }

    @Override
    public FlutterView.RenderMode renderMode() {
        return FlutterView.RenderMode.texture;
    }

    @Override
    public boolean isDebug() {
        return true;
    }

    @Override
    public String initialRoute() {
        return "/";
    }
};

小扩展

      小菜在一个历史项目中集成 FlutterFlutterBoost 遇到 Cause: assert appProject != null 如下问题;

Cause: assert appProject != null
|          |
null       false

      小菜确定集成方式是正确的,于是查阅资料发现很容易解决;小菜历史项目的主 Modulenews 更换为 app 即可;这个问题并非大问题,希望有相同问题的朋友可以提前避免;


      小菜对 FlutterFlutterBoost 的研究还不够深入,还在继续学习探索,如有错误请多多指导!

来源: 阿策小和尚

目录
相关文章
|
1月前
|
前端开发 JavaScript Android开发
Flutter 与 React Native - 详细深入对比分析(2024 年)
Flutter和React Native是两大跨平台框架,各有优缺点。Flutter性能优越,UI灵活,使用Dart;React Native生态广泛,适合JavaScript开发。
236 5
Flutter 与 React Native - 详细深入对比分析(2024 年)
|
20天前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。
|
20天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
74 1
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
74 7
|
2月前
|
开发框架 搜索推荐 开发工具
打造个性化安卓应用:从零开始的Flutter之旅
【8月更文挑战第51天】本文是一篇面向初学者的Flutter入门教程,旨在通过简单易懂的语言和实际代码示例,引导读者步入跨平台移动应用开发的世界。文章首先介绍了Flutter的基本概念和优势,然后逐步展示了如何搭建开发环境、创建第一个Flutter应用,并实现了一个简单的待办事项列表。最后,文章探讨了Flutter在实现高性能和美观界面方面的潜力,鼓励读者发挥创意,探索更多可能。
85 15
|
28天前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
47 0
|
2月前
|
Dart 开发工具 Android开发
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
|
2月前
|
开发框架 Dart 前端开发
Android 跨平台方案对比之Flutter 和 React Native
本文对比了 Flutter 和 React Native 这两个跨平台移动应用开发框架。Flutter 使用 Dart 语言,提供接近原生的性能和丰富的组件库;React Native 则基于 JavaScript,具备庞大的社区支持和灵活性。两者各有优势,选择时需考虑团队技能和项目需求。
332 8
|
2月前
|
安全 Android开发 开发者
探索安卓开发的未来:Kotlin的崛起与Flutter的挑战
在移动开发的广阔天地中,安卓平台始终占据着举足轻重的地位。随着技术的不断进步和开发者需求的多样化,Kotlin和Flutter成为了改变游戏规则的新玩家。本文将深入探讨Kotlin如何以其现代化的特性赢得开发者的青睐,以及Flutter凭借跨平台的能力如何挑战传统的安卓开发模式。通过实际案例分析,我们将揭示这两种技术如何塑造未来的安卓应用开发。
73 6
|
3月前
|
搜索推荐 IDE 开发工具
打造个性化安卓应用:从零开始的Flutter之旅
在数字时代的浪潮中,拥有一款个性化且高效的移动应用已成为许多创业者和企业的梦想。本文将引导你使用Flutter框架,从零基础开始构建一个安卓应用,不仅涉及界面设计、功能实现,还包括性能优化的关键技巧。通过简洁易懂的语言和实用的代码示例,我们将一起探索如何让你的应用在众多竞争者中脱颖而出。 【8月更文挑战第31天】