OpenHarmony上Flutter状态管理:Riverpod+MVVM架构实践
我最初接触 OpenHarmony 上的 Flutter 开发时心里其实挺没底的。毕竟 OpenHarmony 和 Android 的生态差异摆在那里组件库、系统服务、渲染链路全都不一样而 Flutter 的状态管理本来就是个“百家争鸣”的领域Provider、Bloc、GetX、Riverpod 各有一套说法。等我真正把 Riverpod 和 MVVM 架构跑进 OpenHarmony 应用里才发现这套组合不但能落地而且比在 Android 上更值得讲究。这篇文章我把自己的实现思路、踩坑过程、编码细节全部摊开讲希望能帮到正打算在 OpenHarmony 上用 Flutter 做正经应用的人。1. OpenHarmony 上的 Flutter 为什么非要重谈状态管理1.1 OpenHarmony 的 Flutter 兼容性到底怎么样了先说个最基础但也最容易被忽略的事实OpenHarmony 官方早在 3.x 时代就提供了 Flutter 的适配方案社区里甚至能看到 OpenHarmony 的 Flutter 引擎仓库在持续维护。用一句简单的话概括现状——Flutter 应用能在 OpenHarmony 设备上跑起来但“能跑”和“跑得顺”之间隔着一整套工程化问题。OpenHarmony 的应用形态和 Android 不一样它支持 FAFeature Ability和 Stage 模型两种开发范式而 Flutter 嵌入的方式通常是通过FlutterAbility或FlutterContainer去承载。这就带来一个很现实的问题你在 Flutter 里写的Navigator路由和 OpenHarmony 系统侧的Ability生命周期是完全两套体系。比如页面退到后台再回来WidgetsBindingObserver确实能感知到 App 级生命周期但 OpenHarmony 的onBackground、onForeground事件并不一定会直接同步给 Flutter 引擎。这种错位直接放大了一个老生常谈的问题——状态放在哪、怎么保活、怎么在页面切换时不被重置。另一个现实是 OpenHarmony 的渲染后端对 Impeller 的支援还赶不上 Android。Flutter 的 Impeller 渲染引擎在 OpenHarmony 上默认未必开启这意味着很多复杂的页面动效、共享元素转场表现力会打折扣。但状态管理本来就是纯 Dart 层的事和渲染引擎无直接关联所以在 OpenHarmony 上做 Flutter 状态管理反而能规避掉平台差异带来的底层不确定性。1.2 Provider、setState 在 OpenHarmony 场景下暴露出的硬伤我在 OpenHarmony 设备上最早用的其实是 Flutter 自带的setState加 InheritedWidget后来又试过 Provider。坦白说做简单 Demo 一点问题没有但一旦页面栈深了、异步回调多了问题就会接踵而至setState是典型的“组件级”状态它天然适合局部 UI 更新但跨页面共享状态时必须手动一层层往上提最后全塞进根 Widget。这在 OpenHarmony 的 Ability 跳转场景下特别尴尬——Ability 之间的通信本来就靠startAbility传参数数据回传还要走系统广播或公共事件状态根本集中不到一块。Provider 的ChangeNotifier机制本身没问题可它依赖 BuildContext 去读取而 OpenHarmony 的 Flutter 容器在页面切换时经常出现 Context 短暂失效的情况一旦你在对话框或异步回调里用context.read偶尔就会收到空异常。这不是说 Provider 不能用而是说在 OpenHarmony 这种“系统侧生命周期和应用侧页面栈分离”的环境里需要一种不依赖 Widget 树、不依赖 BuildContext、可全局访问的状态容器。Riverpod 恰好就是从根上规避 Context 的方案它把 Provider 容器的生命周期独立出来整个应用的状态存储和数据流都不再绑定 UI 层。1.3 MVVM 架构在 OpenHarmony Flutter 应用里的真实价值MVVM 不是新概念但放在 OpenHarmony 上它的“解耦价值”会被放大数倍。原因很简单OpenHarmony 应用要面对三种页面载体——ArkUI 写的原生页面、Flutter 页面、以及 Web 组件加载的页面。当 Flutter 模块被嵌入一个 Stage 模型的原生应用时你的 ViewModel 层如果写得足够干净就能被 ArkTS 侧通过桥接调用甚至复用同一套模型层的逻辑。具体到 Flutter 这边MVVM 的落地方式很成熟View 是 Widget 树ViewModel 是状态载体和行为入口Model 是数据源与业务规则。Riverpod 里的StateNotifierProvider或AsyncNotifierProvider天然就是 ViewModel 的等价物。它既要负责管理页面状态又要暴露驱动状态变化的方法。用这种方法Flutter 页面和 OpenHarmony 原生侧通信时只需要把 ViewModel 的输入输出统一成标准化接口UI 怎么重组都不影响底层逻辑。2. Riverpod 的核心机制拆解以及它和 MVVM 的映射逻辑2.1 主要 Provider 类型怎么选看这一张表就够Riverpod 2.x 版本里最常用的 Provider 无外乎五种我直接给出一张我在 OpenHarmony 项目里反复对照过的表Provider 类型适用场景MVVM 中的角色是否推荐在 OpenHarmony 用Provider注入只读依赖、服务实例Model 层的仓库对象强烈推荐StateProvider简单的标量状态如开关、输入框值ViewModel 中的临时字段少量使用StateNotifierProvider有复杂业务逻辑的状态管理同步/异步操作ViewModel 主体强烈推荐FutureProvider异步获取一次数据如网络请求ViewModel 中用于初始化加载视场景而定StreamProvider持续监听数据流如位置、消息推送ViewModel 中的订阅源推荐这里想特别提醒一句StateProvider只适合存“无逻辑的裸状态”如果某个状态的改变伴随了业务处理、数据校验、接口调用就一定要用StateNotifierProvider。我见过不少 OpenHarmony 开发者拿StateProvider硬扛业务逻辑最后状态和操作散落一地重构成本极高。2.2 用 StateNotifier 实现 ViewModel代码结构立刻清晰在 MVVM 架构里ViewModel 最基本的要求是状态暴露给 View 用方法暴露给事件用不直接依赖任何 Widget。Riverpod 的StateNotifierT完美满足这一点。比如我做一个登录页面ViewModel 大概是这个形态class LoginViewModel extends StateNotifierLoginState { LoginViewModel(this._authRepository) : super(const LoginState.initial()); final AuthRepository _authRepository; Futurevoid login(String username, String password) async { state state.copyWith(isLoading: true, errorMessage: null); try { final user await _authRepository.login(username, password); state state.copyWith( isLoading: false, isLoggedIn: true, user: user, ); } catch (e) { state state.copyWith( isLoading: false, errorMessage: e.toString(), ); } } }然后把 ViewModel 交给 Riverpod 管理final loginViewModelProvider StateNotifierProviderLoginViewModel, LoginState((ref) { return LoginViewModel(ref.watch(authRepositoryProvider)); });你会发现LoginViewModel里完全没有任何 BuildContext也不 import 任何 Flutter 组件库——这就意味着它在纯 Dart 层可以被单独跑测试。放到 OpenHarmony 场景下这套 ViewModel 不仅能让 Flutter 页面用还能被单元测试框架直接验证同时整份业务逻辑不会因为 Flutter 引擎的版本升级或者 OpenHarmony 的系统变化而失效。2.3 依赖注入自动化解耦比 Provider 的 Provider.of 更适合 OpenHarmony用过 Provider 的人大概熟悉这么一句Provider.ofT(context)或者context.watchT()。麻烦在哪第一必须传 BuildContext 进去第二必须在 Widget 树某个祖先节点上存在对应的 Provider 实例。OpenHarmony 的 Flutter 页面如果嵌在原生 Ability 中Widget 树经常会被重建Provider 的作用域一乱ProviderNotFoundException就来了。Riverpod 的思路是全局容器ProviderContainer它不依赖 Widget 树。哪怕你在 OpenHarmony 的原生侧通过接口触发 Dart 层逻辑只要拿到同一个ProviderContainer引用就能读取或修改任意 Providerfinal container ProviderContainer(); final loginState container.read(loginViewModelProvider); container.read(loginViewModelProvider.notifier).login(admin, 123456);这种方式在原生 Ability 和 Flutter 引擎通信时尤其好用。比如 OpenHarmony 侧的首页按钮点击后需要通知 Flutter 页面刷新你不必非得传递 MethodChannel 回调只要在 Flutter 侧订阅同一个 Provider 的变化数据流自然就通了。3. 一套从头搭到跑Riverpod MVVM 在 OpenHarmony 里的实战过程3.1 工程初始化和依赖配置最容易忽视的版本问题我用的是 Flutter stable 分支版本锁定在3.16.x对应的 OpenHarmony SDK 版本为API 10。这些版本号不是随便写的因为 OpenHarmony 对 Flutter 的适配毕竟是“后置兼容”Flutter 引擎升级过快会导致部分系统插件失效。我实测过Flutter 3.22 以上版本在某些 OpenHarmony 设备上连MethodChannel的调用都会偶发超时所以建议保守选择社区验证过的组合。pubspec.yaml 里的核心依赖如下dependencies: flutter_riverpod: ^2.4.0 riverpod_annotation: ^2.1.0 dio: ^5.3.0 json_annotation: ^4.8.0 dev_dependencies: build_runner: ^2.4.0 riverpod_generator: ^2.3.0如果你需要代码生成来省去手写StateNotifierProvider的模板代码可以用riverpod_annotation加riverpod_generator。但我要说句实话小项目没必要上代码生成器手写也很清晰反而能让你更理解 Riverpod 的运作逻辑。我自己的项目里只有超过 5 个 ViewModel 之后才引入了代码生成。3.2 三层结构落地以“设备列表”页面为例这是我在 OpenHarmony 真机上跑起来的第一个完整 MVVM 页面。先看 Model 层我用HmdDevice表示从 OpenHarmony 设备接口拿到的设备信息class HmdDevice { final String deviceId; final String deviceName; final int batteryLevel; final bool isConnected; HmdDevice({ required this.deviceId, required this.deviceName, required this.batteryLevel, required this.isConnected, }); factory HmdDevice.fromJson(MapString, dynamic json) { return HmdDevice( deviceId: json[deviceId] as String, deviceName: json[deviceName] as String, batteryLevel: json[batteryLevel] as int, isConnected: json[isConnected] as bool, ); } }然后是 ViewModel我继承了AsyncNotifier因为设备列表的加载天然是异步操作AsyncNotifier能给出一整套自带loading、error、data状态管理的写法class DeviceListViewModel extends AsyncNotifierListHmdDevice { override FutureListHmdDevice build() async { final service ref.watch(deviceServiceProvider); return service.fetchDevices(); } Futurevoid refresh() async { final service ref.watch(deviceServiceProvider); state const AsyncLoading(); state await AsyncValue.guard(() service.fetchDevices()); } } final deviceListViewModelProvider AsyncNotifierProviderDeviceListViewModel, ListHmdDevice( DeviceListViewModel.new, );View 层就非常干净了ConsumerWidget轮不到处理任何业务逻辑只负责根据AsyncValue的状态渲染不同界面class DeviceListPage extends ConsumerWidget { const DeviceListPage({super.key}); override Widget build(BuildContext context, WidgetRef ref) { final devicesAsync ref.watch(deviceListViewModelProvider); return Scaffold( appBar: AppBar(title: const Text(设备列表)), body: devicesAsync.when( data: (devices) ListView.builder( itemCount: devices.length, itemBuilder: (context, index) { final device devices[index]; return ListTile( title: Text(device.deviceName), subtitle: Text(电量 ${device.batteryLevel}%), trailing: device.isConnected ? const Icon(Icons.link) : const Icon(Icons.link_off), ); }, ), loading: () const Center(child: CircularProgressIndicator()), error: (error, stack) Center(child: Text(加载失败$error)), ), ); } }这段代码你能看出 MVVM 的三层边界非常清晰HmdDevice管数据模型DeviceListViewModel管状态和刷新逻辑DeviceListPage管 UI 渲染。哪怕 OpenHarmony 平台把 Flutter 容器销毁再重建只要 ViewModel 的 Provider 还存在于全局容器中数据就能无缝恢复。3.3 页面组件通信Riverpod 帮助解决跨组件状态同步Flutter 里组件通信一直是高频问题网上的方案无非是回调、InheritedWidget、Event Bus等等。但放到 OpenHarmony 页面里组件层级往往会更复杂——一个页面可能同时包含 Flutter 渲染的上半屏、原生组件占位的下半屏中间的数据同步最稳妥的做法就是通过共享 Provider。举个例子设备详情页里有个连接按钮点击后不仅 Flutter 侧按钮要变色OpenHarmony 原生侧也要弹一个系统对话框确认。这时候我会定义一个ConnectionProviderFlutter 侧点击按钮直接修改 Provider 状态同时通过此前建立的 MethodChannel 通知原生侧。原生侧确认后反过来再调用 Flutter 的方法更新 Provider。全程两个 UI 层不直接互相持有引用只认同一个状态源final connectionStateProvider StateNotifierProviderConnectionController, ConnectionState((ref) { return ConnectionController(ref); }); class ConnectionController extends StateNotifierConnectionState { ConnectionController(this._ref) : super(const ConnectionState.disconnected()); final Ref _ref; Futurevoid toggleConnection() async { if (state.status ConnectionStatus.connected) { await disconnect(); } else { await connect(); } } }这种做法本质上就是以数据为桥梁让 Flutter 组件和 OpenHarmony 原生组件通过同一个状态容器交流比传来传去的回调函数要可靠得多也更好调试。4. 在 OpenHarmony 真机上跑起来之后那些绕不开的坑4.1 页面路由和状态保活按 Home 键再回来为什么我的状态丢了这是我在 OpenHarmony 真机上踩得最惨的一个坑。Flutter 页面被嵌入 Stage 模型的 Ability 后用户一旦切到别的应用或按 Home 键回到桌面系统可能会回收 Flutter 引擎的内存缓存。此时默认情况下整个 Dart isolate 都会被销毁重建什么ProviderContainer、全局状态全部清零。有人会说 Flutter 自带WidgetsBindingObserver能感知生命周期然后手动保存状态。但 OpenHarmony 的系统事件到达 Flutter 侧往往有延迟甚至部分版本只回调AppLifecycleState.detached直接跳过了paused。如果你把保存动作挂在paused里就永远触发不了。我最后的解决方案是把根 ProviderContainer 的创建和销毁绑定到 OpenHarmony 的 FlutterAbility 生命周期上用原生侧的回调通知 Dart 层做状态序列化。大致思路是在onBackground回调里通过 MethodChannel 调用 Flutter 侧一个专门的方法。这个方法内部读取所有关键 Provider 的 state转成 JSON写入本地缓存。在onForeground回调里先尝试从缓存恢复状态再创建 ProviderContainer。这样即使进程被杀死下次冷启动也能通过缓存恢复页面。如果你做得更细还可以把StateNotifier的 state 自动同步到SharedPreferences但注意避免高频写入最好做防抖。4.2 内存泄漏排查Widget 被销毁了Provider 却还活着Riverpod 的 Provider 默认是“全局单例”只要容器不销毁Provider 实例就一直在。这在单页面应用里没问题但 OpenHarmony 一个应用往往由多个 Ability 构成每个 Ability 如果都创建一个新的ProviderContainer那就干净但如果你图省事把容器做成单例就可能发生一个 Ability 的 ViewModel 持有另一个 Ability 的数据缓存。更隐蔽的坑是StreamProvider或订阅型 Provider 没有在页面销毁时自动关闭。我在排查设备电量统计页面时发现离开页面后StreamSubscription仍然在工作造成上层 Widget 不断重建。解决方案是用ref.onDispose明确清理final batteryStreamProvider StreamProviderint((ref) { final service ref.watch(batteryServiceProvider); final stream service.watchBattery(); ref.onDispose(() service.stopWatch()); return stream; });在 OpenHarmony 上因为系统服务本身可能会挂着蓝牙、传感器等硬件资源onDispose必须确保把底层硬件访问一并关闭否则会出现“页面关了传感器还在跑”的诡异现象。4.3 渲染与平台通道Impeller 和 MethodChannel 的隐性冲突就我个人的实测来说OpenHarmony 设备上 Flutter 引擎对 Impeller 的支援还不完整。开着 Impeller 跑复杂页面偶尔会出现文字边缘发虚、动画掉帧。如果项目里大量使用了自定义 shader甚至会闪黑屏。我的建议是直接在flutter命令行启动时加上--no-enable-impeller先保证帧率稳定再考虑高级渲染效果。MethodChannel 在 OpenHarmony 上也有自己的脾气。部分 API 版本对二进制大对象比如图片、音频数据的传输效率很低超过几 MB 就会卡死主通道。遇到这种情况我建议把大文件改用BasicMessageChannel的分片传输或者直接写入临时文件后让原生侧去读文件。这虽然不是状态管理的直接内容但状态里如果存了较大的临时数据传输方式设计不好整个页面都会跟着卡顿。4.4 测试驱动下的稳定运行为 ViewModel 写测试有多划算OpenHarmony 的 Flutter 应用部署链路本来就比 Android 繁琐如果业务逻辑出了问题每次都要烧录、调试、看日志效率很低。我后来给自己定了一条死规矩所有 ViewModel 必须配单元测试。因为 ViewModel 里不依赖 BuildContext用纯 Dart 测试就能覆盖 90% 的交互逻辑。Riverpod 官方提供ProviderContainer做测试配合mockito劫持仓库实例整个过程非常顺滑final container ProviderContainer(overrides: [ deviceServiceProvider.overrideWithValue(MockDeviceService()), ]); final viewModel container.read(deviceListViewModelProvider.notifier); await viewModel.refresh(); expect(container.read(deviceListViewModelProvider).value?.length, 3);这套测试在 Android 和 OpenHarmony 上毫无差别因为跑的根本是纯 Dart 测试。只要业务逻辑在纯 Dart 层测试通过平台差异导致的问题就只剩 UI 层渲染和系统通道对接排查范围瞬间缩小一大半。另外说一句我身边还有同事用flutter test做 CI 门禁每次提交代码后自动跑所有 ViewModel 测试。这套流程落地之后项目里因状态管理引入的回归问题基本绝迹了强烈建议团队统一引入。5. 最后留几个我一直在用的经验性结论Riverpod 和 MVVM 的组合在 OpenHarmony 上跑起来后我的直接感受是分层做得越干净后期适配新设备就越省心。如果某天你要把 OpenHarmony 应用移植到另一个类 Flutter 嵌入环境只需更换最底层的仓库存取实现ViewModel 和 UI 层几乎不用动。我特别建议把StateNotifier里的业务逻辑写成“纯方法”不要直接调用网络请求而是调用仓库接口。这样测试时只需替换仓库 Mock不必关心底层平台。还有一点是关于团队开发节奏的。Riverpod 的学习曲线比 Provider 稍陡但一旦成员理解了Provider、StateNotifier、AsyncValue这三个核心概念后面写代码的速度反而更快。因为每块业务都按照同样模板生产代码评审和跨模块协作的效率高很多。最后分享一个小技巧在 OpenHarmony 的 Flutter 工程里如果遇到状态更新了但 UI 不刷新的怪问题先检查一下是不是在ProviderScope外面读了 Provider。我遇到过一次类似情况原因是某个工具类直接ProviderContainer创建了独立容器和 UI 用的不是同一个导致两个容器各存各的数据UI 自然看不到变化。统一使用最顶层的ProviderScope容器这类灵异问题会一下子变少。

相关新闻

AnyPS5:跨平台DualSense手柄映射与低延迟输入转发实战

AnyPS5:跨平台DualSense手柄映射与低延迟输入转发实战

1. 项目缘起与核心定位AnyPS5 这个名字第一次出现在我视野里的时候,我正被一堆跨平台输入设备的适配问题折腾得够呛。简单来说,这是一个围绕 PlayStation 5 手柄(DualSense)在非原生平台上实现完整功能映射与低延迟输入转发的开源…

2026/10/11 8:56:25 阅读更多 →
JavaWeb毕设实战:车辆违章信息管理系统设计开发与答辩指南

JavaWeb毕设实战:车辆违章信息管理系统设计开发与答辩指南

每年毕业季,总有不少同学来找我聊同一个话题:“JavaWeb方向,选什么毕设题目比较稳?”我通常都会推荐车辆违章信息管理系统。说实话,这类题目不新,甚至有点“烂大街”,但正因为成熟度高、套路清晰…

2026/10/11 8:56:55 阅读更多 →
微网并离网切换技术解析:架构、控制策略与调试实践

微网并离网切换技术解析:架构、控制策略与调试实践

1. 先搞清楚微网为什么要"并离网切换"做微网项目这些年,被问得最多的一句话是:"不就是电网停电了,微网自己接着发电吗?一个开关的事,有什么好折腾的?"每次听到这种话,我都想…

2026/10/11 10:02:54 阅读更多 →

最新新闻

如何用ClawTeam组建你的第一个多智能体团队:从建队、派单到交付的完整实战教程

如何用ClawTeam组建你的第一个多智能体团队:从建队、派单到交付的完整实战教程

人工智能AI Agent多智能体Agent 编排代码智能体CLI 【免费下载链接】ClawTeam-OpenClaw ClawTeam fork fully adapted for OpenClaw — multi-agent swarm coordination with OpenClaw as the default agent 项目地址: https://gitcode.com/gh_mirrors/cl/ClawTeam-…

2026/10/11 13:59:15 阅读更多 →
自建GitHub镜像站:Gitea、Nginx与Worker三种方案详解

自建GitHub镜像站:Gitea、Nginx与Worker三种方案详解

做GitHub镜像站这件事,听起来像是大厂才需要的基建,但这两年我接触到的中小团队、实验室、个人开发者,越来越多的都在考虑自己搭一个。GitHub镜像站,简单说就是把你高频使用的仓库、Release文件、源码浏览入口,放到自己…

2026/10/11 13:59:15 阅读更多 →
基于Spring Boot的中医药方与非处方药查询推荐系统实战

基于Spring Boot的中医药方与非处方药查询推荐系统实战

1. 整体设计:先想清楚查询与推荐到底是什么关系 1.1 这个项目不是做一个药品字典 Spring Boot Java 做中医药方非处方药物的查询与推荐,标题听起来像是一个普通的信息管理系统,很多第一次接触的人会下意识地说:不就是给药品表加…

2026/10/11 13:59:15 阅读更多 →
Linux OOM机制详解:从内核斩杀线到生产环境制度设计

Linux OOM机制详解:从内核斩杀线到生产环境制度设计

日志里出现 Out of memory: Killed process 的那一刻,你往往没有什么思考时间,内核已经替你做了决定。我自己做运维和系统设计这些年,见过太多人在这一行日志面前手足无措,然后一顿乱调参数,最后也不知道自己调的东西…

2026/10/11 13:59:15 阅读更多 →
RAG文本分块优化:Chonkie架构、核心分块器与调优实战

RAG文本分块优化:Chonkie架构、核心分块器与调优实战

1. 为什么分块会成为RAG管线的隐形瓶颈最近在调一个RAG管线的召回效果时,我把检索链路从召回、排序到Embedding模型都排查了一遍,最后发现瓶颈竟然是最不起眼的文本分块环节。那段时间正好把Chonkie这个面向RAG的文本分块库完整研究了一遍,从…

2026/10/11 13:59:15 阅读更多 →
向量数据库与图数据库协同检索:突破多跳关联推理瓶颈

向量数据库与图数据库协同检索:突破多跳关联推理瓶颈

做知识类应用的开发者,大概都经历过这样的场景:一开始把文档切片、做embedding、灌进向量数据库,接上大模型做检索增强生成,demo跑起来挺顺,问什么答什么。可一旦问题从"某功能怎么用"变成"A出问题会不…

2026/10/11 13:58:14 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →