乐趣区

关于flutter:融云-Flutter-SDK跨平台开发的真香之选

(点击报名融云 2022 社交泛娱乐出海嘉年华)

Flutter 可能是最受欢迎的跨平台框架。关注【融云寰球互联网通信云】理解更多

作为 Google 2018 年正式推出的构建 UI 工具包,Flutter 反对一套代码库高效构建多平台利用;应用 Dart 为开发语言,利用 Skia 绘图引擎,间接通过 CPU、GPU 进行绘制,不须要依赖任何原生的控件。

谷歌在 2022 开发大会上正式推出 Flutter 3.0,并发表目前已有超过 50 万个应用程序是用 Flutter 建设的。从咱们相熟的微信,到出海巨头 SHEIN 以及大量行业和公共机构利用,越来越多开发者采纳它构建应用程序。

为了助力开发者更加简略疾速地集成 IM 和 RTC 相干性能,融云提供 Flutter SDK,为开发者带来更敌对、更简便的即时通讯和实时音视频能力。


Flutter 为何如此受青眼?

多平台的解决方案

在 Flutter 3.0 公布后,Flutter 曾经反对 iOS、Android、Web、Windows、Mac 以及 Linux 六个平台,开发者能够应用一套代码库在所有的平台进行运行,使得 Flutter 在跨平台的解决方案上有了更强的竞争力。

高性能的渲染计划

相比其余跨平台计划,Flutter 基于 Skia 2D 硬件加速图形引擎封装的渲染计划,依赖零碎的图形绘制,最大水平保障了多平台的一致性,且渲染效率相比原生性能相差无几。

丰盛社区生态

截至目前,Flutter GitHub 上曾经有 144K 个 Star,官网仓库 pub.dev 曾经上传了大概 3W 个插件,蕴含了罕用的各种性能。融云的次要性能都提供了相干的 Flutter 插件并上传到了官网仓库。

另外,在融云出品的程序员综艺《猿桌派》中,来自知乎的张彦瑞还从开发者的角度分享了应用 Flutter 的另一重吸引力:

“Flutter 是开源的,让咱们有机会对 UI 零碎的构建、内存治理、编译等进行深挖。即便咱们当前不必 Flutter 了,也能够通过它去理解一套语言是怎么构建的,程序是怎么加载的,整个树是怎么构建的,渲染引擎是怎么做的。这些都是能够让咱们触类旁通的底层宝藏。”


融云相干插件及劣势

[rongcloud_im_wrapper_plugin]
rongcloud_im_wrapper_plugin 是基于融云原生 IM SDK 封装的 Flutter 插件,目前曾经反对原生 IM 的所有性能,包含单聊、群聊、聊天室、超级群,并提供了全新的自定义音讯模式。开发者集成后仅需几步即可疾速实现 IM 通信性能。

[rongcloud_rtc_wrapper_plugin]
rongcloud_rtc_wrapper_plugin 是基于融云原生 RTC SDK 封装的 Flutter 插件,提供了原生 RTC SDK 的次要性能,反对会议模式、直播模式。开发者基于此插件能够疾速集成音视频能力。

[rongcloud_call_wrapper_plugin]
rongcloud_call_wrapper_plugin 是基于融云 CallLib 封装的 Flutter 插件,可反对开发者疾速集成 1V1 呼叫性能。

残缺的生命周期

Flutter SDK 提供残缺的生命周期治理,保障开发者在应用 SDK 时,资源都能被失常开释,缩小异常情况的产生。开发者在应用时都须要创立相干的引擎对象,利用引擎对象实现各种性能接口的调用,在应用完结时需对引擎对象进行销毁。

// 创立引擎对象
RCIMIWEngineOptions options = RCIMIWEngineOptions.create();
RCIMIWEngine engine = await RCIMIWEngine.create(appkey, options);

// 调用 IM 性能
engine.connect(
        token,
        timeout,
      );
...

engine.disconnect(receivePush);

// 销毁引擎对象
engine.destroy();

加强接口的辨认度和易用性

相比原生的 SDK,Flutter SDK 在封装接口的同时,还对接口进行了从新设计组合,在缩小接口数量的同时也保障了性能的完整性。

以原生 IM SDK 获取音讯为例,原生 SDK 提供:

获取本地音讯的接口:getHistoryMessages
获取远端音讯的接口:getRemoteHistoryMessages

Flutter SDK 将下面接口整合为一个接口 loadMessages, 同时提供了一个获取的策略,依据开发者传入的参数来确认是获取本地或者是远端的音讯。

原生 SDK 获取本地音讯:

channelEngine.getHistoryMessages(type, targetId, channelId, sentTime, count, order, new IRongCoreCallback.ResultCallback<List<Message>>() {
    @Override
    public void onSuccess(List<Message> messages) {}

    @Override
    public void onError(IRongCoreEnum.CoreErrorCode e) {}});

原生 SDK 获取远端音讯:

channelEngine.getRemoteHistoryMessages(type, targetId, channelId, option, new IRongCoreCallback.ResultCallback<List<Message>>() {
            @Override
            public void onSuccess(List<Message> messages) { }

            @Override
            public void onError(IRongCoreEnum.CoreErrorCode e) {}});

Flutter SDK 反对开发者通过 policy 传入对应的获取策略,包含只获取本地、只获取远端、获取本地和远端:

engine?.onMessagesLoaded = (
      int? code,
      RCIMIWConversationType? type,
      String? targetId,
      String? channelId,
      int? sentTime,
      RCIMIWTimeOrder? order,
      List<RCIMIWMessage>? messages,
    ) {}
int? code = await engine?.loadMessages(
        type,
        targetId,
        channelId,
        sentTime,
        order,
        policy,
        count,
      );

对立接口调用形式

Flutter SDK 不再应用传统的 性能对象调用相干性能、各个功能模块互相宰割 的封装接口模式。这种模式接口扩散,开发者无奈精确判断出 SDK 的某个接口应该在哪个功能模块下,造成了肯定的学习老本。

Flutter SDK 在接口设计上,不再连续这种模式,而是将所有的接口进行精简,而后对立到一个接口类中,咱们称这个为 平铺接口。在应用平铺接口时,开发者能够在这个接口类调用到 SDK 的任何性能,从而缩小开发者对 SDK 的学习老本,将更多的精力聚焦于业务自身。


疾速集成融云 Flutter SDK

以 IM 能力为例,展现疾速集成融云 Flutter SDK 的相干步骤。

初始化 SDK

RCIMIWEngineOptions options = RCIMIWEngineOptions.create();
RCIMIWEngine engine = await RCIMIWEngine.create(appkey, options);

链接融云并设置监听

RCIMIWEngineOptions options = RCIMIWEngineOptions.create();
RCIMIWEngine engine = await RCIMIWEngine.create(appkey, options);

收发音讯

engine.onMessageReceived = (
  RCIMIWMessage? message,
  int? left,
  bool? offline,
  bool? hasPackage,
) {// 收到音讯};

RCIMIWTextMessage? textMessage = await engine.createTextMessage(
        conversationType,
        targetId,
        channelId,
        text,
      );
engine.sendMessage(message);

退出登录并销毁

engine.disconnect(receivePush);
engine.destroy();
退出移动版