周五还在聊怎么不做“先诱后换”来筹钱,转眼到了这周工程侧,就直接掏出两个新的可视化编辑器。PR #5272 合入的两个组件——所见即所得的 RichTextArea 和 IDE 风格的 CodeEditor,看起来风马牛不相及,底下其实是同一套抽象,有点东西。
代号一这个开源框架本身的定位就不重复了:一套 Java/Kotlin 代码出 iOS、安卓、桌面和 Web 原生应用。这次这两个编辑器,表面上一个让你像用 Word 一样排富文本,一个带着行号边栏、明暗主题和自动补全括号引号,骨子里却都从 AbstractEditorComponent 继承下来。这个基类自己不画任何像素,只通过几条语义指令和后端沟通:“加粗”、“设置语言为 Java”、“把当前的 HTML 给我”、“文本变了”等等。组件从不假设编辑器具体怎么渲染,它只管提要求和听汇报。
承载这组指令的后端有两个,随时可换。第一个是架在 BrowserComponent 之上的跨平台引擎,编辑器的 HTML 和 JavaScript 全打包在核心 jar 里,运行时不需要额外下载。到了哪个平台就用哪个平台的 Web 视图——iOS 用 WKWebView,安卓用 WebView,桌面模拟器走 CEF,Web 目标则是 iframe。这么一走,等于免费借用了系统的虚拟键盘处理和物理键盘响应,不必再自己一个平台一个平台地重新实现文本输入。第二个后端是可选的,由平台端口提供:平台可以通过 CodenameOneImplementation#createNativeEditorPeer 返回一个原生编辑器对等体,然后处理 editorPeerCommand 和 editorPeerQuery 就行,组件代码一行不改。CodeEditor 里再上层一点的 setEngineURL(...) 也是一样的思路,允许接入你自己托管的完整 Monaco 或 CodeMirror 构建,让编辑器拿到更丰富的引擎能力。
CodeEditor 目前能对 Java、Kotlin、JavaScript、Python、CSS、XML、JSON、C 这八种语言做语法高亮。它自带行号边栏、亮暗两套主题,敲括号或引号时会自动补上另一半,省去不少机械按键。至于代码补全,作者直接用了异步方案——注册一个 CodeCompletionProvider,通过回调返回建议列表,而不是让补全方法卡在返回值上。这样即便补全源需要去查索引、调远端接口,编辑器界面也不会冻结。
这种“只管下抽象命令,不管最后谁来画”的设计,让键盘行为、平台差异这类烦人的细节变成了后端的内部问题,前期写组件的人不用跟着头疼。八种语言、两个表面完全不同的编辑器,就靠这套指令通道和两个可插拔后端撑了起来,把复杂度藏在了语义层下面。
热门跟贴