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天前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
14 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
14天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
37 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
14天前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
73 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
16天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
121 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
1月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
36 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
3月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
3月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
353 4
|
3月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
89 8
|
4月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
197 1
|
4月前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    Android历史版本与APK文件结构
  • 3
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 4
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 5
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 9
    轻松在本地部署 DeepSeek 蒸馏模型并无缝集成到你的 IDE
  • 10
    百聆:集成Deepseek API及语音技术的开源AI语音对话助手,实时交互延迟低至800ms
  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    14
  • 2
    零基础构建即时通讯开源项目OpenIM移动端-Flutter篇
    58
  • 3
    flutter3-dart3-dymall原创仿抖音(直播+短视频+聊天)商城app系统模板
    38
  • 4
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    141
  • 5
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 6
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 7
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121
  • 8
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    75
  • 9
    flutter开发中Use ‘const’ with the constructor to improve performance. Try adding the ‘const’ keyword to the constructor invocation.报错如何解决-优雅草卓伊凡
    18
  • 10
    【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    27