Flutter鸿蒙适配实战:marker富文本库迁移指南
做 Flutter 开发这几年最怕听到的一句话是“这个库在鸿蒙上跑不了”。尤其当项目里已经用上了类似 marker 这种带标记语法的富文本解析库迁移成本往往不只是改几行代码那么简单。市面上能把 Markdown 类文本渲染成富文本的 Flutter 库不少但 marker 的特点是“轻量、可控、样式规则灵活”它不做全量 Markdown 语法支持而是让你自己定义标记规则比如[b]表示加粗、[colorred]表示变红。这种设计让它非常适合做聊天消息高亮、日志着色、条款文本标注这类场景但也意味着在鸿蒙化适配时你不能简单套用 Android 或 iOS 上的那套默认实现得把解析、渲染、字体、测量这些链路都重新梳理一遍。我最近正好把一个内部项目从 Flutter 标准平台迁移到鸿蒙环境marker 是其中一个核心依赖。整个过程踩了不少坑也把 marker 的源码翻了个底朝天。这篇博文我把适配思路、工程改造步骤、验证方法以及排查过的典型问题都记录下来希望对正在做 Flutter 鸿蒙化适配的团队有帮助。无论你是刚开始接触鸿蒙 Flutter 开发还是已经在适配其他三方库这篇文章都值得花十分钟看完。1. 项目背景与鸿蒙化需求拆解1.1 背景Flutter 开发者都在面对什么过去一年多越来越多的 Flutter 团队开始评估鸿蒙原生工程即使用 ArkTS ArkUI 叠加 OpenHarmony 底层能力的应用接入方案。过去我们常说的“一套代码多端运行”在鸿蒙这里要打个折扣Flutter 的稳定版 SDK 对鸿蒙的支持是这两年才逐步补上的三方库的生态成熟度参差不齐。很多在 pub.dev 上很活跃的插件要么依赖了 dart:ui 里尚未被鸿蒙实现的底层 API要么直接使用了 MethodChannel 调 Android/iOS 原生代码而这两条路在鸿蒙上都不好走。marker 这个库还算幸运它本身是纯 Dart 实现核心逻辑不依赖任何平台原生代码。照理说纯 Dart 库在鸿蒙 Flutter 环境里应该是“即插即用”的但我实际适配后发现鸿蒙 Flutter 引擎对 dart:ui 的裁剪和差异远比想象中大特别是文本测量和字体 fallback 这两块直接影响渲染结果。所以我的结论是适配工作并不在于“能不能跑”而在于“跑出来对不对”。1.2 需求拆解marker 到底要适配什么marker 的核心功能可以拆成三条链路解析链路把带自定义标记的原始字符串拆成结构化节点树比如# 标题、**加粗**、[urlxxx]这类规则全部转成内部节点模型。渲染链路把节点树映射成 Flutter 的TextSpan树交给RichText或Text.rich显示。扩展链路允许开发者自定义标记语法、自定义样式映射、甚至自定义节点渲染行为。所谓鸿蒙化适配就是保证这三条链路在鸿蒙渲染引擎下输出结果与 Android/iOS 端保持一致。再细一点说我们需要关心四个点TextSpan的style属性在鸿蒙上是否完整生效比如fontFamilyFallback、decoration、textBaseline。TextPainter的测量结果是否与标准引擎一致有没有像素级偏差。自定义字体在鸿蒙系统上如何加载和回退。长文本解析和渲染的性能表现在鸿蒙的 Flutter 引擎上会不会出现明显劣化。2. marker 库核心机制拆解2.1 解析与渲染管线从原始字符串到 TextSpan要适配先要懂它的管线。marker 的解析过程大致是输入一个字符串先由一个词法扫描器按字符流读取识别出标记符号比如方括号、星号、井号再经过语法组装生成一棵节点树最后由渲染器把这棵树转换成 Flutter 的富文本组件树。这个过程可以类比成编译器词法分析 - 语法分析 - 代码生成只不过这里的“代码”变成了 TextSpan。我实测下来marker 对开闭标签的处理比较灵活允许嵌套、允许同一行内多个标记并存。比如这是一段 [b]加粗[/b] 文本[colorred]红色[/color] 警告解析后生成的节点树大概是RootNode ├── TextNode(这是一段 ) ├── BoldNode(加粗) ├── TextNode( 文本) ├── ColorNode(红色, red) └── TextNode( 警告)渲染时每个节点负责把自己的样式叠加到 TextSpan 上。BoldNode 会在 style 上增加fontWeight: FontWeight.boldColorNode 会设置color。关键在于嵌套节点如何处理样式叠加marker 采用了“样式继承 覆盖”的方式子节点会保留父节点的样式只修改自己负责的那部分属性。2.2 标记规则的扩展点在哪里marker 最吸引人的地方是标记规则可以自定义。它内部有一个 tag 注册表通过类似addTag()的接口告诉解析器遇到[xxx]时创建什么节点遇到[/xxx]时表示结束。风格上很像正则替换但比正则强在它是真正的树形推导可以正确处理嵌套。这套扩展机制对鸿蒙化适配非常关键。因为鸿蒙 ArkUI 侧如果要用原生富文本能力我们不能直接让 Flutter 的 TextSpan 跨到原生层必须自己把 marker 的节点树“翻译”成 ArkUI 能理解的数据结构比如一个ListSpanModel。这个翻译动作完全可以复用 marker 的扩展点不改解析逻辑只改输出目标。2.3 样式映射与继承策略样式继承是适配中容易出问题的点。举一个我实际遇到的例子marker 里[size20]会把字号设为 20但如果这段文本挂在一个已经设置了fontSize: 16的父节点下不同端上的处理策略可能不同。标准 Flutter 是直接覆盖父级字号但鸿蒙 ArkUI 的 Span 组件在部分版本上对字号继承的处理存在特殊性如果不显式设置会继续沿用外层默认字号。所以适配时要做的不是“照抄样式”而是“显式化”。我后来在适配层里规定凡是在 marker 规则里声明的样式属性必须显式地写入目标样式对象不允许依赖继承。这样虽然代码上啰嗦了一点但确实能避免大量跨端不一致的问题。3. 鸿蒙化适配的技术路径与实操3.1 工程改造第一步接入鸿蒙 Flutter SDK适配的第一步不是改 marker 源码而是先确保 Flutter 工程能在鸿蒙环境下成功编译、打包、运行。这一点不夸张地说是我踩坑最多的地方很多问题根本不是 marker 造成的而是 Flutter 鸿蒙工程本身没有配置好。以常见的 OpenHarmony Flutter SDK 集成为例你需要把你的 Flutter 项目按鸿蒙工程结构重新组织。大致结构如下my_app/ ├── lib/ # Dart 业务代码 ├── ohos/ │ ├── entry/ │ │ ├── src/main/ │ │ │ ├── ets/ # ArkTS 原生代码 │ │ │ └── module.json5 # 模块配置 │ │ ├── build-profile.json5 │ │ └── hvigorfile.ts │ └── build-profile.json5 └── pubspec.yaml有几个配置点很容易错module.json5里要配置好 deviceTypes缺了跑不到真机上。build-profile.json5里需要声明依赖的 SDK 版本不同版本的 OpenHarmony SDK 对 Flutter 引擎的支持程度不同。原生侧需要引入 flutter engine 的 hap 包依赖这个通常在oh-package.json5里声明。我的建议是不要手工拼工程直接用鸿蒙官方提供的 Flutter 模板工程起步然后把你的 lib 目录和 pubspec 依赖迁移过去。marker 这种纯 Dart 包在迁移时只需要正常列在 dependencies 里配合 pub 源配置就能解析下载。注意当前 Flutter SDK 的鸿蒙适配版本还在持续迭代中如果你用的是最新 Flutter 稳定版可能会遇到运行时库不匹配的问题。建议优先选用鸿蒙文档支持的 Flutter 版本组合。3.2 平台无关性改造增加一层抽象适配把工程跑起来之后我开始对 marker 做接入层改造。marker 本身是纯 Dart理论上不需要改动 pub 包里的源码但为了隔离平台差异我建议在应用层再做一层薄薄的抽象定义一个通用的富文本模型类似class MarkupSpanModel { final String text; final SpanStyleModel style; final ListMarkupSpanModel children; }然后封装一个渲染入口class MarkupRenderer { // 返回转好的 TextSpan标准 Flutter 侧用 TextSpan toTextSpan(String source) { ... } // 返回转好的 ArkUI 侧模型鸿蒙原生侧用 ListMarkupSpanModel toNativeModels(String source) { ... } }这样做的意义在于如果未来鸿蒙 Flutter 引擎补齐了所有 API你仍然可以走 TextSpan 路线如果某些能力迟迟不完善你就可以无缝切到原生 ArkUI 渲染。相当于给自己留了一条退路而不是把命运押在单一渲染路径上。3.3 ArkTS 侧的桥接方案原生富文本渲染如果你的场景需要原生能力补齐比如某些字体特性在 Flutter 渲染层表现不好那就要考虑把 marker 解析结果传给 ArkTS 侧渲染。这里我采用的方案是在 dart 侧解析成MarkupSpanModel列表通过MethodChannel或者EventChannel传给 ArkTS 原生侧然后原生侧用 ArkUI 的Span组件逐个构建富文本。ArkTS 侧我建了一个解析器接口接受类似 JSON 的模型数组。大致结构如下interface MarkupSpanModel { text: string; fontWeight?: string; color?: string; fontSize?: number; children?: MarkupSpanModel[]; }然后遍历模型构建对应 Spanfunction buildSpan(model: MarkupSpanModel): Span { let span new Span(model.text); if (model.fontWeight bold) { span.fontWeight(FontWeight.Bold); } if (model.color) { span.fontColor(Color.parse(model.color)); } // 递归处理 children return span; }这条路线的优点是原生渲染能力更完整尤其是鸿蒙系统对中文排版、字体回退的支持比 Flutter 引擎上的表现更成熟。缺点是桥接成本高来回传输数据有性能损耗。如果你只是渲染一次这个损耗可以忽略但如果你在列表项里频繁调用就要考虑缓存解析结果了。3.4 构建产物与 hap 打包验证适配完成后就是验证能不能出包。鸿蒙工程的构建产物是 HAPHarmonyOS Ability Package不同于 Android 的 APK。在 Flutter 鸿蒙工程里打包流程一般走 hvigor 构建工具。命令类似hvigorw assembleHap我实测下来有几个小技巧可以分享完事之前先跑hvigorw clean否则一些老的缓存文件会导致 Flutter engine 的 so 库没打进去。在build-profile.json5的 signingConfig 里提前配好签名否则装真机的时候会提示签名错误。用 DevEco Studio 打开 ohos 目录时会自动识别 Flutter 工程结构但不要让它自动改配置文件不然可能把你的依赖声明弄乱。出来 HAP 之后通过 DevEco Studio 或命令行工具安装到真机或模拟器上先用最基础的一个 marker 示例页跑通解析一段带[b][color]的文本正常显示点击操作正常这就说明适配的大框架已经通了。4. 适配过程踩坑实录与排查技巧4.1 文本测量不一致导致布局错乱这是我遇到的第一个大坑。同样的内容在 Android 上显示正常在鸿蒙上就会出现文字截断、换行位置不对。排查后发现问题出在TextPainter的测量结果上鸿蒙 Flutter 引擎在计算某些字体尤其是中文字体的宽度时和标准 Flutter 引擎有细微差异导致maxLines限制下的省略号位置出现偏差。解决方案也很务实不要依赖TextPainter.width, 直接使用LayoutBuilder动态测量容器宽度然后对字符串做二次截断。或者更干脆一点在需要精确控制的场景里不用 TextSpan 的maxLines、overflow属性而是先自己按字符数估算显示长度再裁剪文本。这样做牺牲了一点精度但可以稳定规避平台差异。4.2 字体回退链路失效marker 允许在样式里配置fontFamilyFallback这些字体在 Android 上是按列表顺序逐个尝试加载。鸿蒙 Flutter 引擎对字体 fallback 的实现当时还有缺失表现为如果主字体加载失败直接显示豆腐块而不是继续尝试 fallback 列表里的字体。这个问题的解决思路有两步。第一步在应用层把鸿蒙系统字体纳入字体加载列表比如显式注册HarmonyOS Sans这类系统字体。第二步给 marker 的样式映射增加一个“字体降级”钩子如果传入的字体名称在鸿蒙上加载失败就自动替换回系统默认字体。// 伪代码示意字体降级逻辑 String resolveFont(String fontName) { if (isHarmonyOS() !isFontAvailable(fontName)) { return HarmonyOS Sans; } return fontName; }严格来说这不是 marker 的 bug而是整个鸿蒙 Flutter 生态的成熟度问题。但只要提前考虑到这一点也不会影响功能上线。4.3 MethodChannel 平台通道初始化异常在走“dart 解析、ArkTS 渲染”这条路时我遇到了平台通道初始化不成功的现象。具体报错很泛日志里只看到“channel is not initialized”之类的字样。排查后发现问题出在工程里没有正确注册 Flutter 插件到 ArkTS 侧。鸿蒙 Flutter 的插件机制和 Android 不完全一样。你需要确保原生侧实现了统一的插件注册入口并且在module.json5里声明了对应扩展点。否则 MethodChannel 的调用会失败导致 marker 解析出的富文本模型无法传给原生侧。这里我补充一个经验在拿不准通道是否可用时务必写一个探活逻辑。比如启动后第一时间调用一次getPlatformVersion()这类最简单的通道方法确认通了再往下走核心链路。不要直接让业务代码去调用富文本桥接否则失败了排查范围会很大。4.4 长文本解析卡顿与内存抖动marker 的解析速度在大文本下会明显下降。我测过一段 2000 字左右、包含上百个标记的文本在低端鸿蒙设备上会出现解析耗时超过 300ms 的情况。虽然不至于卡死但在列表滚动时如果反复解析就能感觉到掉帧。优化的思路有三个方向缓存解析结果把相同文本的解析结果缓存起来用字符串哈希做 key。marker 解析结果是一次性生成的对象缓存复用完全没问题。异步解析把 marker 的解析过程放到 isolate 中执行解析完成后再回主线程渲染。懒解析只在文本进入视口时才触发解析滚动离开时丢弃。我最终采用的方式是“缓存 懒解析”组合效果最明显首屏加载时间反而因为减少了无谓渲染而变短了。4.5 典型问题速查表现象根因解决方案文字截断省略号位置不对TextPainter 测量偏差改用 LayoutBuilder 动态测量自行截断自定义字体变成豆腐块字体 fallback 失效显式注册系统字体配置降级钩子MethodChannel 调用失败插件未在 ArkTS 侧注册检查插件注册入口与 module.json5 配置长文本解析卡顿单次解析耗时高无缓存结果缓存 懒解析 isolate 异步解析富文本样式未生效依赖了样式继承适配层把样式属性显式化不允许继承5. 适配效果验证与性能对比5.1 功能回归用例设计验证适配是否成功不能只“跑通”一个简单例子我建议设计一套覆盖三类核心能力的用例基础标记加粗、斜体、颜色、字号、下划线、删除线。嵌套标记加粗里套颜色颜色里套字号确保样式叠加正确。特殊字符转义字符、标记符号本身显示、超长文本、空文本、只有标记没有文本。每一类用例都至少准备 5 组不同的输入对比 Android 和鸿蒙上的渲染结果截图。注意不能只看文字内容要看字体、间距、换行位置是否一致。我实测下来基础标记在鸿蒙上通过率很高但嵌套标记中“同类型标记叠加”这个场景最容易出问题。比如[b][b]双重加粗[/b][/b]标准 Flutter 上会正常叠加鸿蒙的某些版本上却可能出现样式被重置。原因还是继承策略不完整所以适配层要额外做一遍“幂等去重”。5.2 帧率与内存数据性能对比我记录了三个指标解析耗时、渲染帧率、内存占用。在同一个中端鸿蒙设备上适配前后对比指标适配前标准侧适配后鸿蒙侧备注2000 字 100 标记解析耗时180ms196ms差异约 9%可接受列表滑动帧率55fps52fps降低不到 6%峰值内存85MB92MB主要是桥接数据传输的开销数据说明纯 Dart 解析部分在鸿蒙上的性能差异不大主要损耗集中在 ArkTS 桥接层的数据序列化和反序列化。如果对性能敏感可以考虑把桥接数据改成二进制格式或者直接放弃原生渲染全部走 Flutter 侧 TextSpan。5.3 后续扩展空间这次适配完成之后我还在继续探索几个方向把 marker 的解析能力封装成一个更通用的“富文本中间层”让 Flutter 侧和 ArkTS 侧共享同一套数据模型。增加自定义字体加载体系统一管理鸿蒙系统字体和业务自带字体。尝试在鸿蒙的 List 组件里复用缓存好的富文本模型进一步优化滚动性能。这些内容后续有空我会单独写一篇展开讲这里不展开了。如果让我给这次适配总结一句体会那就是对纯 Dart 的三方库鸿蒙化适配的重点从来不是语法兼容而是渲染细节的一致性。marker 本身的解析逻辑在鸿蒙上跑得很好真正让我花时间的是字体、测量、继承这些和系统底层强相关的部分。但只要把这些细节逐一确认到位整个适配工程的成功率会非常高。

相关新闻

Docker与Docker Compose离线安装包:测试环境标准化部署指南

Docker与Docker Compose离线安装包:测试环境标准化部署指南

简介:本资源为 Docker 与 Docker Compose 一站式离线安装包合集,面向 Linux 系统运维人员、DevOps 工程师及容器化初学者,解决无外网环境或受限网络下快速部署核心容器工具的刚需。压缩包共含 4 个关键文件:适用于 x86 架构的 Doc…

2026/10/11 14:04:41 阅读更多 →
AI检测原理与降AI率实战:从80%到10%的结构化改写方法

AI检测原理与降AI率实战:从80%到10%的结构化改写方法

先说个真实情况:这几个月,我前前后后帮朋友和自己处理过十几篇被学校AI检测系统标红的稿子,从初稿AI率80%的“一眼假”,改到终稿稳定在10%以内,走的不是网上流传的“翻译大法”“同义词替换大法”,而是把检…

2026/10/12 8:26:22 阅读更多 →
Excel导出实战:前后端选型、大文件优化与踩坑指南

Excel导出实战:前后端选型、大文件优化与踩坑指南

Excel导出大概是后台管理系统里出现频率最高的“简单功能”之一。我在大小项目里都做过这个需求,也被它坑过不少次。看起来不复杂:前端遍历一下数据生成一个表格,或者后端写个接口返回一个文件,好像就能收工。但真实项目里&#x…

2026/10/12 4:24:40 阅读更多 →

最新新闻

基于SSM+Vue的养老服务平台设计与实现——毕设项目技术全解析

基于SSM+Vue的养老服务平台设计与实现——毕设项目技术全解析

做 Java 后端、写 Vue 前端的这些年,SSMVUE这套组合我经手过不少项目,但要说最值得拿出来好好聊聊的,大概率还是这个老人养老服务平台。作为计算机毕业设计选题,它比普通的管理系统多了一层人文关怀,又比纯电商项目多了…

2026/10/12 8:50:01 阅读更多 →
Vibe Coding与Claw之争:AI时代编程范式与工程实践指南

Vibe Coding与Claw之争:AI时代编程范式与工程实践指南

不知道为什么,最近朋友圈里聊AI编程的人都在问同一个问题:“为什么会Vibe Coding的,不养Claw龙虾?”我第一次看到这个标题的时候也愣了几秒,然后反射性地笑出声。Vibe和Claw,读音押韵,意思却南辕…

2026/10/12 8:50:00 阅读更多 →
SpringBoot+Vue洗衣店管理系统开发实战:状态机与权限控制

SpringBoot+Vue洗衣店管理系统开发实战:状态机与权限控制

1. 项目概述与核心需求拆解1.1 这个毕业设计到底在做什么洗衣店管理系统,乍一听是个不起眼的管理系统,但真做起来你会发现它麻雀虽小五脏俱全。绝大部分同学做毕业设计时喜欢选图书管理、超市管理这类烂大街的题目,而洗衣店这个场景天然自带一…

2026/10/12 8:50:00 阅读更多 →
SYN Cookies原理与内核参数配置:从TCP三次握手到SYN Flood防御实战

SYN Cookies原理与内核参数配置:从TCP三次握手到SYN Flood防御实战

SYN Cookies这东西,搞网络和运维的兄弟应该都听过,但真正把它原理吃透、知道生产环境怎么配的人不算多。前阵子我帮一个业务团队排查连接超时问题,最后定位到是SYN Flood导致的半连接队列被打满,顺手把tcp_syncookies相关机制完整…

2026/10/12 8:50:00 阅读更多 →
基于Django的蔬菜销售分析与预测可视化系统毕设实战拆解

基于Django的蔬菜销售分析与预测可视化系统毕设实战拆解

1. 先看明白这个毕设到底要做什么打开标题里的关键词:“大数据毕设项目”、“基于django”、“蔬菜销售分析与预测可视化系统”、“源码文档,讲解、调试运行、定制”。一句话概括,这就是个面向毕业设计的典型全栈工程——用Django把“数据分析…

2026/10/12 8:50:00 阅读更多 →
ThinkPHP美食商城系统开发实践:路由、订单与库存事务处理

ThinkPHP美食商城系统开发实践:路由、订单与库存事务处理

真要做“ThinkPHP美食商城网站”这种课题,多数人第一反应是“又是个学生作业”。但真正动手把商城从零搭起来,并且能跑通下单、支付、库存扣减这一整套流程之后,你会发现这个“老框架”里头能挖的东西比想象中多。这篇文章就围绕我在开发这套…

2026/10/12 8:48:56 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →