GetX状态管理与路由导航:Flutter跨端开发的极简实践

1. 状态管理与路由选型,为什么总是跨端项目里最先暴露的短板

前阵子我在维护一个用 Flutter 写的跨端业务项目时,被 GetX 的路由和状态管理方案彻底改变了代码组织方式。页面数量一上来,代码就开始不受控:widget 层到处是 setState,业务状态分散在各处,路由跳转全靠 MaterialPageRoute 硬拼,每次改动一个业务流程,要连带改三四个文件。后来我把状态管理和路由导航切到 GetX 上,代码量肉眼可见缩了一圈,团队的沟通成本也低了很多。

考虑到标题里的“鸿蒙跨端框架 Flutter 学习”,我猜不少人是冲着“鸿蒙 + Flutter”这个跨端背景来的。目前 Flutter 生态在鸿蒙平台已经能实际跑起来,很多跨端团队开始把老的 Flutter 工程往鸿蒙适配。在这个过程里,状态管理怎么选、路由怎么接,往往比页面本身更先暴露问题。GetX 的好处恰好在于,它没有强制你去学一堆抽象概念,不需要像 Provider 那样写一堆 ChangeNotifier,不需要像 Bloc 那样把 event、state、bloc 拆成三个文件,它就是把响应式状态、控制器、路由、依赖注入这些常用能力打包在一起,用最少的模板把你带到能跑的状态。所谓“全家桶”,说的就是这件事。

适合什么样的人读呢?我觉得这几类是 GetX 的目标用户:已经能写基础 Demo,但还没想清楚业务状态放哪里的新手;从 Android / iOS 切过来做 Flutter 的开发者,希望少学一点“框架的框架”;以及正在做存量 Flutter 工程重构、想把代码量降下来的团队。下面我会直接放代码,并解释每个步骤背后的取舍,而不是只贴一个能跑的东西。

1.1 从“页面多了代码失控”说起

继续说那个让代码失控的场景。一个列表页,里面有筛选条件、搜索结果、加载状态、空状态,如果这些状态全部放在 StatefulWidget 里,页面一复杂,setState 调用次数和 build 次数都很难控制。我们当时最头疼的不是某一个页面,而是两个页面共享同一份业务数据——列表页改了筛选条件,详情页要看到筛选结果。传统的做法是把状态提升到父组件,再一层层往下传回调,页面深一点就传麻了。这时候状态管理已经不是“用哪个 API”的问题,而是“状态在哪一层、归谁所有、如何流转”的架构问题。

GetX 的思路很直接:状态放 Controller,页面组件只管订阅和渲染。Controller 不挂在 widget 树上,而是由 GetX 容器统一管理。页面 A 和页面 B 各自 find 同一个 controller,读到的就是同一份内存对象,天然解决了跨页面同步问题。不需要刻意设计事件总线,也不需要把构造器层层传下去,这是它“极简”的第一层含义。

1.2 状态管理框架对比:模板代码量与团队上手成本

我拿自己先后用过的几种方案做个简单对照,不说谁好谁坏,工程选型本来就取决于场景和团队:

方案模板代码量核心心智成本适合场景
setState + 回调少状态提升、回调层层传组件级小状态
Provider + ChangeNotifier中理解继承 widget、监听通知中大型业务
Riverpod中高需要对 Provider 体系有整体认识追求编译期安全和架构化
Bloc高event/state/diagram 三层分离大型团队规范优先
GetX低只需记住 .obs、Get.put、Get.to追求开发效率、快速交付

这个表不是说 GetX 天下无敌。它的短板也很明显:动态性强、API 灵活,约束力弱,大型团队如果没有代码规范,容易写出风格混乱的 controller。但如果你是个人开发者、小团队,或者正在做跨端适配这种“业务代码要尽量少碰”的工程,GetX 的性价比非常高。适配鸿蒙平台时尤其如此,因为平台差异带来的坑已经很多了,如果状态管理还让你多写一堆模板,开发进度很容易被拖垮。

2. GetX 状态管理实操:响应式变量、控制器生命周期和绑定机制

2.1 响应式变量与普通变量的使用边界

GetX 状态管理的核心不是 controller 本身,而是那层“响应式”。你可以把它理解成:给每个变量装了一个小喇叭,变量的值一变,所有关心它的页面都会自动收到通知并重建局部组件。实际写法是:

class CounterController extends GetxController { final count = 0.obs; // 响应式变量 void increment() => count.value++; }

页面里用一个简单组件去监听:

Obx(() => Text('${controller.count.value}'))

页面视图本身不会因为 count 变化而整体重建,重建的只是 Obx 包裹进去的那一小块。这一点和 setState 整个 StatefulWidget 重建有本质区别。当页面里有一个高频变化的数据,比如倒计时、进度条,旁边的静态内容不会跟着反复执行 build,性能上的差距很快就体现出来。

但响应式不是银弹。如果某个变量只是控制器内部使用的状态,不参与界面渲染,那就不需要用.obs。比如一个计算中间值、一个请求用的 token,把它设成普通字段即可。用.obs的本质是给“界面关心的数据变化”加一层监听,用得太随意反而会增加不必要的通知链路。GetX 里还有一种是 GetBuilder,它不监听单个变量,而是收到 setState 指令后刷新整页,适合“整个页面数据都要变”的简单场景,比如切换深色模式。我在实际项目里通常以.obs为主,GetBuilder 偶尔用于简单的整页刷新。

2.2 控制器的生命周期管理与依赖注入

控制器继承GetxController后,就有了onInit、onReady、onClose这几个生命周期钩子。onInit里做变量初始化、注册监听;onReady里等第一个帧准备好之后做异步请求或耗时初始化;onClose里释放资源。用法如下:

class UserController extends GetxController { final userInfo = UserModel().obs; @override void onInit() { super.onInit(); // 初始化字段、注册监听 } @override void onReady() { super.onReady(); _fetchUserInfo(); // 首帧完成后发起请求 } @override void onClose() { // 释放流、取消定时器、销毁监听 super.onClose(); } }

很多人忽略了生命周期和依赖注入是绑定的。如果用Get.put(controller)把一个 controller 放进容器,又通过Get.find(controller)在别的页面读取,那么当一个路由完全销毁时,GetX 会自动调用onClose,把里面的流、定时器一并清理。这个机制解决了跨端开发里一个很常见的痛点:页面都销毁了,后台还挂着一堆监听和请求,导致内存悄悄涨。Controller 归谁管理、何时销毁,路由机制替你做掉了,这正是“极简”的地方。

2.3 何时用 GetBuilder、Obx 还是 GetX

这个问题几乎每次分享都会被问到。简单说,Obx是细粒度监听,适合单个字段变化时局部刷新;GetBuilder是整页手动刷新,适合逻辑上一次性更新多个字段;GetX<T>组件本身更像 Obx 和 GetBuilder 的结合,可以传入 controller 实例,适合在页面里临时创建局部 controller。实际中我建议项目里统一优先用 Obx,因为编码心智最简单——只要把界面里依赖响应式变量的地方包起来,就自动精确刷新。只有在需要一次刷新大量内容、又不想引入过多细粒度响应式变量时,才用 GetBuilder。GetX 组件用得相对少,因为它需要额外关心控制器实例创建时机,不如 Obx 顺手。

3. 极简路由导航:从命名路由到参数传递的完整闭环

3.1 命令式导航到命名路由的转换

Flutter 原生里,页面跳转通常用Navigator.push和MaterialPageRoute,再多一点用命名路由,在MaterialApp里统一注册。GetX 的路由更像一个调度中心,直接通过Get.to()就能完成:

// 原生 Navigator.push(context, MaterialPageRoute(builder: (_) => DetailPage())); // GetX Get.to(() => DetailPage());

这里有个细节:Get.to的页面默认带返回手势和返回按钮。如果某个页面不想显示返回,比如从登录页跳主页面,可以用Get.off(() => MainPage())。如果想一次性清掉整条路由栈,比如退出登录回到登录页,用Get.offAll(() => LoginPage())。命名路由也支持:

GetPage(name: '/detail', page: () => const DetailPage()) Get.toNamed('/detail', arguments: {'id': 1});

为什么 GetX 的路由会比原生少写那么多代码?因为原生路由要求你同时处理 context、builder、route 这三样东西,而页面明明已经知道自己是哪个页面了。GetX 把“我要去哪个页面”这一个意图简化成一行,其它信息全部默认。要注意的坑是:如果项目一开始用的是Navigator.push,后来想统一换成命名路由,别一次性全换,容易把路由栈的顺序搞乱。可以分块迁移,先迁一级页面,再迁二级页面。

3.2 参数传递:对象传递、query 字符串和回调数据

跨端项目里,页面间传参经常不只是一个 id,还可能是一个完整的业务对象。原生写法里,你得为每个页面定义一个构造器字段,页面一多非常啰嗦。GetX 提供的方式是用 arguments 传任意对象:

// 发起方 Get.toNamed('/detail', arguments: OrderModel(id: 1, name: '测试')); // 接收方 final OrderModel order = Get.arguments as OrderModel;

如果只是简单参数,也可以用命名路由的 query:

Get.toNamed('/detail?id=1&name=test'); // 然后在详情页里 String id = Get.parameters['id'];

这里我建议优先用对象传参,而不是字符串拼 query。原因有二:一是对象传参有编译期类型检查,query 字符串容易在拼写时出错;二是复杂对象转 query 要考虑编码,很麻烦。但有个点要注意:用Get.arguments传对象时,接收方不要在 build 里反复做as强转,尤其不要在每次重建时都转。一旦路由复用、参数类型改变,崩溃会发生在运行期,用户点到那里才会暴露。

页面返回结果也是常见的需求。详情页修改了数据,返回列表页后要刷新,原生写法要配合Navigator.pop的返回值加 await。GetX 更直接:

// 详情页点返回按钮并带上新值 Get.back(result: updatedData); // 列表页发起跳转 final result = await Get.to(() => DetailPage()); if (result != null) { /* 刷新列表 */ }

3.3 嵌套路由与底部 Tab 切换:保持状态还是重建页面

多 Tab 页面(比如首页、消息、我的)是另一个容易掉坑的地方。如果用Get.to去切换 Tab,每次都会重新创建页面,用户会明显感觉到下拉位置、滚动位置丢了。正确做法是用IndexedStack把几个主 Tab 包起来,配合 GetView 或者 Obx 监听当前索引切换,这样每个 Tab 只创建一次,所有滚动位置和输入状态都保留。日常开发中,Tab 页面甚至不需要复杂的路由配置,只需要通过 controller 里的 index 来切换。如果某个 Tab 内部还要做二级跳转,那才需要结合命名路由,让二级页面盖在整个 Tab 框架之上,避免 Tab 区域被底栏遮挡。

4. 依赖注入、多语言和 Snackbar:GetX 全家桶里那些“顺手带走”的能力

4.1 Get.put、Get.lazyPut 与 Get.find:三种实例处理方式

很多人学 GetX 只学状态管理和路由,其实它最值钱的反而是依赖注入。它用一种极简的写法,替代了手写单例和手动传构造器。

// 在启动时注册 Get.put(ApiService()); // 或者在第一次使用时才创建 Get.lazyPut(() => ApiService()); // 其他任何位置直接拿 final ApiService api = Get.find<ApiService>();

Get.put创建后立即生成实例,适合一定需要的全局对象;Get.lazyPut是懒加载,第一次 find 时才真正创建,适合“可能用不到”的服务,可以减少启动时的初始化耗时。我拿 lazyPut 做配置服务、埋点服务,拿 put 做核心的、页面基本都依赖的业务服务。要注意的是,满屏Get.put会让启动时间变长,尤其里面有网络连接、数据库初始化这类耗时操作时,应尽量用 lazyPut,并考虑用fenix参数控制 controller 的销毁策略。

4.2 GetMaterialApp:主题与语言切换这一层

如果项目里需要做中英文切换或者深色模式,原生 Flutter 需要手动处理 MaterialApp 的 locale 和 theme 参数,切换很麻烦。GetX 给出的方案是,把应用入口替换成 GetMaterialApp,然后用Get.changeTheme和Get.updateLocale触发全局更新:

GetMaterialApp( title: 'demo', translations: AppTranslations(), // 翻译映射 locale: const Locale('zh', 'CN'), fallbackLocale: const Locale('zh', 'CN'), theme: ThemeData.light(), darkTheme: ThemeData.dark(), )

切换时只要一行:Get.changeTheme(Get.isDarkMode ? ThemeData.light() : ThemeData.dark())。多语言则用tr方法:Text('hello'.tr)。这对跨端项目很友好,因为系统语言从中文切换成英文的场景在鸿蒙设备上也会遇到。要留意的是,如果工程里原来用了 flutter_localizations,接入 GetMaterialApp 时两者可以共存,只需把 localizationsDelegates 也传给 GetMaterialApp。

4.3 Snackbar、Dialog 与 BottomSheet:一键弹出而非手动管理 context

原生 Flutter 弹 SnackBar 需要ScaffoldMessenger.of(context),弹 Dialog 需要showDialog(context: ...)。很多时候页面里没有顺手可用的 context,或者异步回调已经丢失了 context,这时候就很痛苦。GetX 的做法是完全不依赖 context:

Get.snackbar('提示', '操作已成功', snackPosition: SnackPosition.BOTTOM); Get.dialog(MyDialog()); Get.bottomSheet(MyBottomSheet());

这个能力在实际开发里非常省事,尤其适合登录超时、强提示、支付结果这类“不管用户当前在哪个页面都要弹出来”的场景。但也要提醒一下:Get 的默认 snackbar 样式和原生 ScaffoldMessenger 不太一样,如果 UI 设计要求严格,可以在样式上多配置几个参数,或者仍然用原生封装的组件,不要因为“极简”而牺牲掉视觉还原。

5. 存量 Flutter 工程接入 GetX:渐进式重构与坑盘点

5.1 渐进式重构:先接路由再接状态

存量工程改造是最容易翻车的地方。我曾经把一个 Provider 工程改成 GetX,一开始想全部重写,后来发现页面太多,风险不可控。正确的顺序是:先把路由迁到命名路由,因为路由跟业务状态解耦,迁移成本低,又能立刻体验到跳转简化的好处。路由稳定后,再选几个状态耦合严重的业务模块,把 setState 替换成 controller + Obx,最后才是全局替换依赖注入。这个过程中,老页面对 GetX 可以无感,新写的页面直接用 GetX,两套代码可以共存。前提是不要在同一个页面里混用两套状态管理思路,否则调试时会找不到数据到底被谁更新。

5.2 我踩过的几类坑

第一类是 controller 被重复创建。如果在一个页面里写Get.put(UserController()),而这个页面因为某种原因被压栈后又弹栈,可能造成同一个 key 的 controller 被覆盖。我遇到过的情况是,一次登录流程重复执行后,登录页的 controller 实例换了一个,但主页面还持有旧实例,导致数据对不上。排查过程也值得说一下:先是在列表页发现修改数据后返回不刷新,打断点确认 Obx 的监听确实触发了,但页面拿到的还是旧数据。再往下追,才发现列表页和详情页在路由栈里分别 put 了同一个 controller,详情页的 put 把列表页的实例覆盖了。解决方案是把该 controller 改成全局 lazyPut,两处都只 find 不 put,数据自然统一。

第二类是响应式监听器没有关闭。.obs变量本身依赖订阅机制,如果某个 controller 长时间不销毁,比如用了永久控制器,那么即使页面已经关闭,监听也可能还在,内存指标会逐渐上升。排查方法很简单:开发模式看内存曲线,或者在onClose里打点确认是否被调用。

第三类是路由命名冲突。用命名路由时,名称最好统一加前缀,比如/pages/home、/pages/detail,不要直接用不带含义的缩写。命名路由多了以后,不统一的命名会让你在排查跳转问题上花费大量时间。

5.3 团队协作层面的约束

GetX 的灵活性高,如果团队没有约定,代码很难收敛。我会给团队定三条简单守则:页面型 controller 放 pages 目录,全局型 controller 放 common/controllers;所有路由页面必须通过命名路由注册,不允许直接Get.to裸页面;controller 里的字段,不需要界面响应的绝不用.obs。这三条守则加上 code review,基本能守住 GetX 工程的边界,不至于写着写着变成风格混乱的大杂烩。

6. 鸿蒙跨端场景下的 GetX 实践:适配要点与最终体会

6.1 鸿蒙设备上跑 Flutter 的适配现状

回到标题里的“鸿蒙”背景。目前的 Flutter 跨端工程往鸿蒙设备适配,已经有一套可操作的路线:鸿蒙生态提供了对应的编译器与运行时适配方案,原本的 Flutter 业务代码大部分可以复用,主要改动集中在 SDK 版本、插件替换和 UI 细节适配。在这个背景下,选择 GetX 并不会给适配增加额外负担,因为它本身是纯 Dart 实现,不依赖任何 Android / iOS 的原生能力,路由和状态都在 Dart 层完成。这一点非常关键——跨端适配最怕的不是业务代码重写,而是“用了一个深度依赖平台通道的库”,到了新平台上发现没人维护。GetX 没有这个风险。

6.2 我在鸿蒙适配项目里注意到的几个细节

第一,注意 Flutter 版本和鸿蒙适配版本要配套。GetX 本身不依赖某个具体的 Flutter 版本,但工程里其它插件为了鸿蒙适配可能换了分支,这会间接影响 Dart SDK 约束,所以 GetX 的版本最好也用相对稳定的版本,不要盲目追新。第二,鸿蒙设备上的返回手势、系统返回键事件,会和 Flutter 侧的路由栈有交互。用 GetX 不需要额外处理太多,它默认的生命周期管理已经覆盖了返回栈的判断。第三,在适配过程中,如果某个页面导航出现“页面销毁但 controller 没销毁”,优先检查这个页面是不是用了全局控制器而不是页面级控制器,全局控制器本身不该随页面销毁。

6.3 最终体会:极简不是少写几行,而是少操几份心

带完这个 GetX 的改造之后,我最大的体会是:所谓极简艺术,不是语法糖堆出来的“少写代码”,而是把本来需要你自觉维护的东西——状态归属、依赖关系、生命周期、路由栈——统一变成一个容器来托管。你写的代码变少,因为很多约定已经内置;你在跨端适配时少踩坑,因为业务逻辑和平台桥接解耦了。如果你正在学 Flutter,或者正把 Flutter 工程往鸿蒙平台推进,我建议你从今天起,找一个小模块,把 setState 和 Navigator.push 换成 GetX 的写法,跑一遍,再决定要不要全套接入。很多选择,自己试过一遍比什么都可靠。

相关新闻

SpringBoot+Vue3前后端分离IT技术交流与分享平台源码解析

SpringBoot+Vue3前后端分离IT技术交流与分享平台源码解析

做社区类系统这些年&#xff0c;我见过太多“IT技术交流平台”要么是想做成技术博客&#xff0c;要么是奔着问答社区去&#xff0c;结果做着做着就往贴吧方向跑偏。这次拿到的这套源码倒是把路子走对了&#xff1a;Java SpringBoot Vue3 MyBatis MySQL&#xff0c;前后端分离…

2026/10/21 3:35:26 阅读更多 →
YOLOv5 PyTorch转TensorRT部署:绕过ONNX NMS陷阱的三明治架构

YOLOv5 PyTorch转TensorRT部署:绕过ONNX NMS陷阱的三明治架构

1. 项目概述&#xff1a;为什么PyTorch版YOLOv5转TensorRT不是“一键转换”&#xff0c;而是一场系统性工程你手头有一份在PyTorch上训练好的YOLOv5模型&#xff0c;精度达标、验证集mAP跑到了0.68&#xff0c;但部署到边缘设备时卡在了3帧/秒——CPU推理慢得像在等泡面煮熟&am…

2026/10/21 3:35:26 阅读更多 →
AI质量管理平台落地全解析:从架构设计到实施避坑指南

AI质量管理平台落地全解析:从架构设计到实施避坑指南

近两年我先后参与过几个制造企业的数字化转型项目&#xff0c;有一个感受特别深&#xff1a;很多工厂老板上来就问"AI能帮我干什么"&#xff0c;但真正聊下来会发现&#xff0c;他们最迫切的需求往往集中在同一个地方——质量。生产现场的不良品率高、客诉频发、质量…

2026/10/21 3:35:26 阅读更多 →

最新新闻

系统化提升个人技能:从技能地图到学习闭环

系统化提升个人技能:从技能地图到学习闭环

今年我陆续和朋友聊了十几场关于个人成长的私话&#xff0c;发现大家焦虑的点出奇一致&#xff1a;不是没在学&#xff0c;而是学的东西太多太散——今天刷两节剪辑课&#xff0c;明天收藏几个AI工具&#xff0c;后天又报名一个Excel进阶班&#xff0c;忙活大半年&#xff0c;最…

2026/10/21 4:14:42 阅读更多 →
M1 Mac上VS Code配置C++调试环境:从编译器到launch.json完整指南

M1 Mac上VS Code配置C++调试环境:从编译器到launch.json完整指南

先把结论放在前面&#xff1a;M1芯片的Mac配置VS Code的C调试环境&#xff0c;核心就三件事——装好编译器、配好编译任务、配好调试任务。听起来很简单&#xff0c;但网上能找到的教程&#xff0c;十有八九还是Intel Mac时代的写法&#xff0c;直接照搬到Apple Silicon上&…

2026/10/21 4:14:42 阅读更多 →
大模型+阿里云生态:呼叫中心智能升级的架构设计与落地实践

大模型+阿里云生态:呼叫中心智能升级的架构设计与落地实践

做呼叫中心系统这些年&#xff0c;我见过太多团队在“智能升级”这件事上反复折腾。传统的IVR导航让用户按到抓狂&#xff0c;人工坐席被重复问题淹没&#xff0c;质检靠抽检基本形同虚设&#xff0c;知识库更新永远追不上业务变化。这些问题不是靠换一套软件就能解决的。直到大…

2026/10/21 4:14:42 阅读更多 →
Docker常用命令实战指南:镜像、容器、网络与故障排查速查手册

Docker常用命令实战指南:镜像、容器、网络与故障排查速查手册

搞技术这么多年&#xff0c;Docker 的命令翻来覆去就那些&#xff0c;但每次一到关键场景&#xff0c;总有人开始现场查文档。尤其是现在容器化已经成了标配&#xff0c;连写个小的演示项目都要起个数据库容器&#xff0c;Docker 用得熟不熟&#xff0c;直接决定你排查问题的效…

2026/10/21 4:14:42 阅读更多 →
OpenCV day4实战:从灰度化到轮廓提取的图像预处理全流程

OpenCV day4实战:从灰度化到轮廓提取的图像预处理全流程

学习OpenCV到了第4天&#xff0c;正好处在一个很容易让人迷茫&#xff0c;也很容易让人开窍的节点。我经常被刚入门的朋友问到“opencv day_4到底该学什么”&#xff0c;还有人已经跟着教程跑完了前3天&#xff0c;看完图像读取、像素操作、ROI裁剪之后&#xff0c;突然不知道下…

2026/10/21 4:14:42 阅读更多 →
Skills不是标签:构建可验证的能力坐标系

Skills不是标签:构建可验证的能力坐标系

1. “skills”不是标签&#xff0c;是能力坐标系的动态刻度最近在几个技术社区和职业发展类平台反复看到一个现象&#xff1a;大量简历、项目介绍、自我介绍里高频出现“skills”这个词&#xff0c;但点开一看&#xff0c;要么是堆砌一长串技术名词&#xff0c;要么是“精通Pyt…

2026/10/21 4:13:41 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

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

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

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