Flutter for OpenHarmony实战:二手置换App设置页开发全解析
做Flutter for OpenHarmony二手物品置换App设置页看起来是所有模块里最不起眼的那一个。真正动手写的时候你会发现它几乎是整个App里横跨技术面最杂的页面本地存储、主题切换、通知权限、缓存清理、账号安全全都要在这个页面里落地而且OpenHarmony平台和Android/iOS的差异还特别多。这篇文章就通过这个实战项目把设置功能从设计到实现完整拆一遍适合正在做OpenHarmony应用开发、或者想把现有Flutter应用迁移到OpenHarmony平台的开发者参考。我会把项目里踩过的坑和最终采用的方案一起写出来尽量给你一套可以直接抄作业的思路。1. 设置页在二手置换场景里到底管什么1.1 看似简单实则牵扯全局的功能中枢很多人对设置页的第一印象是几个开关加跳转链接这在普通工具类App里确实成立。但放到二手物品置换App里设置页牵涉的东西一下就变多了用户要管理收货地址、管理求购和发布偏好、控制消息通知的范围、处理账号的实名状态这些都是跟交易闭环强相关的能力任何一个开关都会直接影响用户在App里的核心行为。我这次做设置功能第一件事不是写代码而是把所有应该出现在设置页里的能力列了一张清单。消息通知要细分到出价通知、上新通知、求购匹配通知、系统公告隐私设置要区分授权管理、账号注销、黑名单通用设置要处理语言、深色模式、缓存清理再加上关于页面里的版本号和用户协议整个清单整理下来将近二十个条目这个时候你就能明显感觉到设置页的复杂度其实一点不比业务页面低。1.2 业务耦合度决定了设置项的分层方式二手置换App的设置和纯粹的工具类App有个很大区别很多设置项必须动态展示。比如用户的实名认证状态认证过的人要显示已认证没认证的要引导去认证再比如消息通知如果用户当前没有任何求购单求购匹配通知这个开关就没有意义。这就决定了我在做数据模型的时候不能把设置项做成写死的静态列表而是要让业务侧在初始化的时候传入当前用户状态由页面自己决定渲染哪些条目、隐藏哪些条目。这种动态渲染思路需要提前设计好在数据模型层。每个设置分组、每个设置项都需要有可配置的属性展示条件、点击行为、右侧当前值都要支持从外部传入。一开始如果图省事写硬编码后面加业务需求的时候一定会后悔。2. 工程环境与依赖准备2.1 Flutter for OpenHarmony的工程配置要点做Flutter for OpenHarmony开发和标准Flutter开发最大的区别在工程层面。OpenHarmony的Flutter适配层和标准Flutter SDK并不是同一个东西对OpenHarmony设备的支持是通过三方仓库的适配分支完成的。我在项目里使用的是支持OpenHarmony的Flutter SDK版本配合官方IDE工具链拉取OpenHarmony SDK构建目标设为鸿蒙设备。这里有一个特别容易踩坑的地方如果你之前做过标准Flutter项目直接把项目切到OpenHarmony分支pubspec.lock里的依赖版本极大概率要对不齐。因为很多插件在OpenHarmony侧还没有对应实现哪怕有也是从不同仓库拉取的。我建议在动手之前先把依赖逐个做一次兼容性摸底落在pubspec.yaml里的版本全部锁定为已验证可以同时支持OpenHarmony和Android的版本。2.2 设置功能用到的依赖清单设置功能核心依赖其实不多但每一个都要注意OpenHarmony侧的兼容情况。shared_preferences是最基础的键值存储方案在OpenHarmony上跑没有问题底层走的是分布式键值库的持久化能力。package_info_plus用来读版本号这块OpenHarmony的实现基本是齐的。path_provider在缓存清理的时候会用到用来拿临时目录路径。状态管理我选了GetX主要是因为设置页的状态对象小而集中GetX的响应式更新和依赖注入用起来比Provider更轻路由跳转也顺手。这三板斧加上Flutter自带的主题能力和对话框组件设置页的九成功能都能落地。剩下的一成里如果涉及通知权限的检查和跳转系统设置在OpenHarmony上需要走系统API的渠道后面第7节我再细讲。3. 设置分类设计与数据模型3.1 设置项分组逻辑与Order模型设计拿到设置项清单之后最先要做的就是把它们分组。我这里分成了五组个人信息与账号、消息通知、通用设置、隐私与安全、关于与帮助。分组的原则只有一个就是围绕二手物品置换交易的完整链路来分拒绝生硬的通用分类。数据模型我用一个轻量配置对象来描述某个设置项是否满足显示条件而不在UI层做繁重的预渲染逻辑。这个思路配合业务状态的成本很低比如用户未登录时个人信息组的展示条件直接返回false整组自动隐藏。在切换用户或登录状态变化的场景下只需要重新拉取用户状态并调用列表刷新接口设置UI就会按新状态重新渲染。3.2 用配置驱动而非硬编码的渲染思路设置页最忌讳把所有Tile在build方法里写死我第一版原型就是全手动写后面只加一个设置项就要改动整个列表的结构和布局代码维护性差到离谱。这个项目的设置列表我改成配置驱动后渲染层只看数据模型。具体到一个条目的配置我定义了type、title、subtitle、icon、value、showCondition、onTap这几类字段。type支持switch、link、group、action四种value用来绑定开关状态或右侧展示文案onTap处理点击行为每一个条目都是一个完整的独立对象还可以在跨页面复用的时候直接携带参数跳转。这样设计之后不管是新增主题切换还是追加实名认证入口一行配置就能搞定改动成本低很多。这种配置驱动的方式还带来一个额外的好处设置页的自动化测试变得容易了。我只需要写一组针对配置数据的单元测试验证不同类型、不同条件下的渲染分支是否正确不用再为每个设置项维护单独的UI测试用例。4. 核心页面骨架与交互实现4.1 设置页的整体结构与布局组织设置页整体使用ListView加分组标题的方式组织给每个分组设置了一个内边距和统一的圆角卡片容器。这种卡片化的分组样式在视觉上更清爽也符合二手物品交易类App偏生活化的产品调性比单纯的白底加灰色分组标题要耐看。分组卡片内部用Column横向排列设置条目每个条目之间用一条细分割线隔开分割线统一缩进对齐到标题文案的位置视觉重心非常整齐。每个条目的高度控制在52到56之间点击区域做足够大避免出现用户点了有反馈但页面无响应的感觉。交互上普通链接类的条目点击后右侧要有chevron箭头但switch类型右侧必须是真实的开关状态不能把两类放在同一视觉层级里否则用户会搞不清这个条目到底能不能点。4.2 交互反馈的系统规范实现交互反馈这部分我着重做了两件事。第一是统一水波纹效果和点击变色的系统规范在Material组件之上套统一的主题样式确保所有条目点击时的涟漪效果和背景色变化是一致的。第二是switch开关在切换瞬间要有状态回写读取存储成功后再刷新UI避免出现开关在视觉上切过去又弹回来的问题。这里提一个细节主题切换类的设置项点击后不应该立即关闭当前设置页而是应该弹出一个底部的选择面板或者单选弹窗让用户在当前页面就能预览效果。如果跳到一个独立页面再切换返回设置页后发现整个页面视觉变了很多第一次用的人会以为自己误触了什么功能体验不太友好。5. 本地存储与数据持久化5.1 设置项持久化的多端适配方案设置项的价值在于下次打开还是我上次设置的样子所以持久化是设置功能的半壁江山。我用shared_preferences作为主存储存开关类、选择类的设置状态存的内容包括主题模式、语言选择、消息通知各项开关、缓存清理的时间戳等。键的命名统一加上模块前缀比如pref_key_theme_mode、pref_key_notify_bid这样可以避免key因为太短产生冲突。在OpenHarmony平台上有一点需要特别注意shared_preferences的底层实现和Android上不完全一样写入之后在你连续快速切换开关的时候个别极端情况下会出现后写覆盖先写的现象。这个不能靠提高调用频率解决解决办法是每次状态变更后不要依赖其内部自动落盘手动调一次存储的commit或者ensureInitialized并等待返回值确保键值真正写入持久层再刷新UI。5.2 读取时机与并发写入的注意事项读存储的时机也很关键。设置页初始化的时候直接用异步方法取所有键值一次性读出来组装成内存态后续页面操作全部基于内存态只在状态变化时才回写。这种启动时全量读取运行时只写差异的模式比每次打开设置页都去读存储性能好很多也让状态管理逻辑保持简单。并发写入方面我在写通知开关的时候遇到过一次比较奇怪的现象用户连续快速切换出价通知、上新通知、系统公告三个开关最后重新进入设置页发现三个开关的状态跟退出前不一致。排查之后定位为写入顺序没有串行化三个写操作几乎同时提交存储层按到达顺序覆盖最终结果不可预期。解决办法是在存储读写外层包一层串行队列所有写操作排队执行实测之后连续切换没有再出现过状态错乱。6. 动态主题切换与视觉适配6.1 基于GetX实现主题实时切换主题切换是设置页里最有代表性的功能之一我用GetX做了全局状态管理。定义主题模式枚举支持浅色、深色、跟随系统三种选项调用getMaterialApp时把主题模式注入全局控制器切换时直接更新控制器里的状态整个App的MaterialApp会立即按新主题重建。这里有一件需要注意的事切换主题的过程中设置了半透明背景或者使用Material 3动态取色功能的页面在主题切换时可能会出现短暂的背景色跳变。规避方法是在切换前先包一层主题动画并将动画时长控制在200毫秒左右让背景色过渡看起来是渐变的不会突然闪一下。这个细节很细微但对用户感知的影响非常大。6.2 OpenHarmony平台下Material 3样式适配差异Material 3在Flutter for OpenHarmony上基本可用但个别组件的配色映射和Android上有细微差异最明显的是SurfaceContainer系列颜色在OpenHarmony的默认主题映射里可能跟设计稿的色值对不上。我在做设置页卡片背景时依赖了主题里的surfaceContainerLow色结果在OpenHarmony模拟器上看到卡片底色明显发灰后来手动在主题里覆盖了三个SurfaceContainer层的色值才统一了视觉效果。如果你在设计上对背景色分层有严格要求建议不要完全依赖Material 3的默认映射把设计稿中最关键的三到四个色阶在主题配置里显式固定这样无论目标平台的颜色映射怎么变化视觉呈现都是可控的。7. 账号安全与隐私合规7.1 退出登录的二次确认与全局状态清理二手物品置换App的账号体系里退出登录是一个高影响操作。用户退出后其发布记录、求购状态、消息订阅全部都要跟着失效这个不是简单弹一个确认框就能结束的。我在退出登录的点击事件里做了三层处理先弹二次确认对话框确认后异步调用退出接口接口返回成功后把本地的用户信息缓存、消息订阅状态、临时会话数据全部清掉最后才跳转到登录页面。清本地数据这一层容易遗漏如果只清用户缓存不清设置项状态下次用户重新登录进来上一任账号的通知开关状态可能还会残留这在交易类App里会带来不可预期的信息推送体验和安全都受影响。所以我把退出登录设计成了一个统一执行全局清理入口所有数据清理动作都在这个入口里串行执行不做多处散落的清理逻辑。7.2 隐私政策与权限管理的入口设计现在应用商店审核和平台合规对隐私的要求越来越严设置页里必须有清晰的隐私政策入口同时要在用户授权管理里把相机、存储、通知、定位等敏感权限的状态展示出来。用户在这个页面点授权管理应该能看到所有权限当前的授予状态并且可以一键跳转到系统设置或者打开系统权限管理页面。这里我在OpenHarmony上遇到过一个问题跳转系统权限页面的深层链接和Android不一样Android的action在OpenHarmony里没有完全对等的映射直接复用会找不到对应的页面。最后是通过系统提供的应用管理接口引导用户进入该应用的详情页再做权限设置虽然多了一步但确实能到达目标页面体验上会后置到文档说明里进行引导。8. 缓存清理与关于页面8.1 基于path_provider的缓存目录计算与清理二手物品置换App里图片资源比较多用户在浏览商品时会不断产生临时缓存。缓存清理功能需要在设置页展示当前缓存大小并提供一键清理入口。我用path_provider拿到的临时目录作为主要缓存目录清除前先递归读取目录内所有文件的大小累计得到格式化文案。需要注意统计大小这一步在图片文件很多时可能会耗时较长不能放在主线程里同步执行我用Isolate进行了异步计算。清理执行时先把文件列表枚举出来再逐个删除最后重新计算大小并更新UI显示。清理的边界要处理好只能删临时缓存目录绝对不能动用户主动保存的图片和文件。二手App里很多用户会批量保存感兴趣商品的实物照片到本地相册这些东西如果被设置页的缓存清理误删造成的损失是无法挽回的。为了防止这种情况我在项目里单独建了一个业务缓存目录缓存清理只针对这个目录和系统临时目录完全隔离。8.2 版本信息展示与反馈入口关于页面我放了应用名称、版本号、开源许可、用户反馈邮箱和小程序的客服入口。版本号我直接用了package_info_plus读取显示在页面上。用户反馈入口做成alertDialog式的输入框内容提交后异步写入反馈接口。这里有一个看似不起眼但影响深远的设计设置页里所有涉及跳转到外部页面的操作都要统一封装成带返回回调的函数。因为OpenHarmony平台下有些外部页面比如用户协议详情如果直接用WebView打开没有处理好页面栈的返回关系用户一旦进去就退不回来只能用系统返回手势一层层退出体验非常糟糕。我做了一个统一的页面容器传入URL就可以打开WebView页面同时配好路由返回拦截任何外部链接都是在这个容器里打开不影响主页面栈的导航逻辑。9. 常见问题与踩坑实录9.1 通知权限检查在OpenHarmony上的行为差异通知开关类设置在Android上可以通过系统API直接判断NotificationManager的权限状态但在OpenHarmony上这套接口不能直接透传。我在实现消息通知总开关的时候遇到过开关状态和真实系统通知权限不一致的坑。开关显示是打开的但系统侧通知权限实际是关闭状态导致用户收不到出价提醒。我最后的处理方式是在进入消息通知设置页时额外调用系统通知权限查询能力拿到的真实授权状态和本地开关状态放在一起做对账。如果系统权限被关闭总开关先置为关闭状态并提示用户去系统设置开启用户从系统设置返回后重新查询并刷新开关状态。实测之后通知开关的真实性和可靠性明显提升。9.2 主题切换时首帧闪烁的问题深色模式与浅色模式切换在使用系统字体设置和状态栏样式联动时偶尔会出现首帧闪烁。系统状态栏的文字颜色在浅色模式下需要深色文字深色模式下需要浅色文字如果主题切换时状态栏样式更新晚于页面背景色完成更新用户会看到一刹那的颜色反转。解决方案是在切换主题时先更新系统UI样式再更新页面主题状态。我把状态栏图标颜色更新方法放到了主题切换方法体的最前面等系统UI样式应用完成后再触发状态刷新闪烁问题基本消失。这个方法也适用于其他需要页面和系统UI联动的场景。9.3 在模拟器与真机上的兼容性排查OpenHarmony生态的模拟器和真机行为存在差异尤其体现在文件系统路径、存储时序和分享能力上。在模拟器上能正常写入的shared_preferences在真机上偶尔会出现落盘失败在模拟器上能正常打开的WebView页面在真机上可能因为系统组件版本差异导致白屏。我的排查经验是所有存储和WebView相关功能必须在真机上做一轮完整回归模拟器只能作为功能开发验证环境。另外遇到诡异问题先看日志里有没有底层报错关键字大多数情况下OpenHarmony侧的报错信息指向还算是清晰的能省下大量无头绪排查的时间。9.4 依赖版本与构建产物的统一管理OpenHarmony的Flutter适配层还在快速迭代依赖版本之间的兼容性非常敏感。我在项目中期升级过一次适配层版本结果编译产物出现了大量API签名不匹配的错误。后来定了一条规矩所有依赖版本锁定在已验证的适配层版本组合上不随意升级确需升级时先拉出完整的兼容矩阵逐个验证后再合并绝不在开发分支上直接升版本。写设置功能这段时间的真实感受我实际把这套设置功能完整做下来之后最大的体会是设置页不是一个工作的终点反而是检验项目基础设施是否扎实的试金石。你需要有能安全读写存储的基础封装、能全局响应的状态管理、能涵盖多类业务跳转的路由方案才能让设置页的每一个条目都做到看着简单、用着安全。最后分享一个复用的小技巧配置驱动的设置列表模型一旦稳定下来后续新增设置项的成本约等于零。我后来在这个项目里加过两次设置项一次是加免打扰时段一次是加首页偏好排序每次都是改一个配置对象加一个处理函数连页面布局代码都没动过。这个经验值得为你的下一个App提前铺路。

相关新闻

财富底层代码:信息、能力与认知的三层套利思维

财富底层代码:信息、能力与认知的三层套利思维

把“套利”这个词从金融领域拎出来,放到人生和财富的坐标系里看,你会发现它其实是一个被严重低估的思维工具。我不是在讲什么投机取巧的歪门邪道,而是在说一个很朴素的底层原理:同样的资源、同样的能力、同样的努力,放…

2026/10/13 3:38:53 阅读更多 →
Windows开发者必备:cmder增强型命令行工具部署与避坑指南

Windows开发者必备:cmder增强型命令行工具部署与避坑指南

简介:cmder是一款专为Windows用户打造的增强型命令行工具,面向开发者、系统管理员以及习惯命令行操作的高级用户,用于弥补系统自带命令提示符在界面交互、命令集与多任务处理能力上的不足。该工具融合了Linux与Windows常用命令,基…

2026/10/13 3:38:53 阅读更多 →
场景文本检测与识别综述论文翻译:术语表与实操流程

场景文本检测与识别综述论文翻译:术语表与实操流程

1. 翻译这篇论文之前,先弄懂它到底在讲什么最近在帮一位做OCR相关课题的朋友翻译《Scene Text Detection and Recognition: The Deep Learning Era》这篇综述论文,标题里的几个关键词——场景文本检测、场景文本识别、深度学习时代——看似直白&#xff…

2026/10/13 3:38:53 阅读更多 →

最新新闻

MySQL增删改查实战:DML语法、性能优化与常见坑避坑指南

MySQL增删改查实战:DML语法、性能优化与常见坑避坑指南

要说数据库里最基础也最绕不开的操作,“增删改查”这四个字绝对是第一课。不管你是刚入职的初级开发,还是写了多年业务代码的老手,每天写的最多的就是那几条 SQL:往表里插数据、按条件查数据、改几个字段、删掉不再需要的记录。My…

2026/10/13 4:24:05 阅读更多 →
MATLAB LS-SVM工具箱实战:从分类回归到调参避坑

MATLAB LS-SVM工具箱实战:从分类回归到调参避坑

简介:这份资源是面向机器学习研究者与工程师的Matlab版LS-SVMlab1.5工具箱,用于在Matlab环境中实现最小二乘支持向量机,解决非线性分类与回归问题。包内共81个文件,以64个m函数脚本为核心,覆盖训练、调参、预测与评估全…

2026/10/13 4:24:05 阅读更多 →
TR101290错误转换与三级优先级:从TS流监测到可执行总结

TR101290错误转换与三级优先级:从TS流监测到可执行总结

简介:这份 TR101290 总结文档面向数字电视与 MPEG-2 传输流初学者,系统梳理 ES、PES、TS、PS 四种数据流层次,并逐一讲解 PAT、PMT、CAT、NIT 等 PSI 表的 PID 取值与解析流程,可帮助读者快速建立传输流复用与节目定位的整体框架&…

2026/10/13 4:24:05 阅读更多 →
MNIST数据增强实战:从0.993到0.997的PyTorch提分路径

MNIST数据增强实战:从0.993到0.997的PyTorch提分路径

1. 当你以为MNIST已经"到头了",其实差得远先问一个问题:你在Digit Recognizer比赛里跑过baseline吗?如果跑过,你一定经历过那种"数字识别还能玩出什么花"的空虚感——一个简单的CNN就能在验证集上轻松做到99%…

2026/10/13 4:24:05 阅读更多 →
供水管网漏损监测中的压力数据解析与预警算法实践

供水管网漏损监测中的压力数据解析与预警算法实践

半夜两点,值班电话响了,说是某片区的供水压力突然往下掉,调度大屏上已经标红。我到现场一查,压力变送器没坏,线路也通,问题出在上位机——原始值翻倍了,1.2MPa的管网压力被解成了2.4MPa。这种问…

2026/10/13 4:24:05 阅读更多 →
缠中说禅博客评论数据清洗与全文检索实战:从HTML到SQLite FTS5

缠中说禅博客评论数据清洗与全文检索实战:从HTML到SQLite FTS5

简介:这份资源是缠中说禅博客的完整归档压缩包,面向对缠论与股票、期货技术分析感兴趣的投资者及研究者,尤其适合希望系统研读原文、结合评论理解理论脉络的中高级学习者。包内共约2000个文件,以html网页存档为主体,辅…

2026/10/13 4:23:05 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →