Skip to content

【实践分享】把 UIKit 的后端整体换成无服务端 P2P(五平台,附截图);顺问新版是否为自定义数据源留了出口 #36

Description

@agentx-icu

先说结论

我们把 Flutter chat UIKit 的界面原样保留、底下的后端整体换掉,换成了 Tox —— 一个去中心化的 P2P 协议,没有任何服务端、不需要注册账号。一套 Flutter 代码跑 Windows / macOS / Linux / Android / iOS 五个平台,各平台安装包已发布。

项目开源在 agentx-icu/toxee

桌面iPadAndroidiOS

单聊、群聊、文件传输、音视频通话、好友申请、二维码名片都能用;界面一行没改。

需要说清楚的前提:我们基于的是旧版chat-uikit-flutter 的 v2 分支,也就是那个仓库 README 里让大家迁移过来之前的版本。所以下面的经验对新版不一定成立 —— 这正是我想问你们的原因。

想问的问题

我们当时的做法是两条路径并存:

  1. 二进制替换 —— 把 SDK 加载的原生库名换成自己的实现,TIMManager → NativeLibraryManager → bindings.Dart*() 整条调用面不变;
  2. 自定义 TencentCloudChatSdkPlatform —— 历史消息、轮询、通话这些必须由 Dart 侧持有状态的能力走 Platform 路径。

之所以必须做第 1 条,是因为在旧版里,即使设置了自定义 Platform,仍有一部分能力依赖原生库加载,纯 Platform 替代不掉。另外旧版 UIKit 的公开组件是直接读 TencentCloudChat.instance.dataInstance.* 这些私有状态来渲染的,没有公开的数据注入口,我们只能直接写私有成员,再靠一层 facade 收敛住(审计清单在这里,5 个 submodule、约 35 个成员)。

新版是不是变了? 具体三个问题:

  1. 新版这套 *Store 架构,有没有公开的数据注入接口 —— 让 UI 组件从自定义数据源取数,而不是只能写内部状态?
  2. 新版还有没有类似 isCustomPlatform 的自定义 Platform 路径?如果有,它能覆盖完整调用面吗,还是仍有能力必须由原生库提供?
  3. 有没有官方推荐的「离线模式 / 自定义后端 / 纯本地 Mock 演示」做法?这三类需求其实是同一个问题的不同说法,我们只是把它推到了极端。

如果新版已经把这些考虑进去了,我们很愿意在新版上再做一遍并把结果反馈回来 —— 那对你们大概比我们这套旧版的绕法更有参考价值。

相关记录

说明

本项目 GPL-3.0,与腾讯云无隶属关系,也不代表腾讯云的任何背书。我们不重分发你们的 SDK —— 相关依赖由引导脚本在构建时按锁定版本从 pub 拉取到本地的 .gitignore 目录,仓库中不含你们的代码。

最后说句实在话:这件事能做成,本身说明这套 UI 组件的抽象是干净的 —— 把整个后端换掉之后,界面层几乎不用动。这在同类 SDK 里不常见。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions