可持久化倒计时的设计:App 杀死、设备重启后如何续算与失效
一句话概括:倒计时不要存「还剩几秒」,而要存「一个不可篡改的时间基准点 + 总时长」,每次进来用当前时间反推剩余。 这样 App 被杀重启能无缝续算、设备重启能自动判失效、用户改系统时间也没法作弊。本文以验证码重发冷却场景为例,拆解一个可持久化倒计时组件 CountDownUtil 的完整设计与源码脉络。 一、功能定位 CountDownUtil 是一个 object 单例,负责验证码发...
一句话概括:倒计时不要存「还剩几秒」,而要存「一个不可篡改的时间基准点 + 总时长」,每次进来用当前时间反推剩余。 这样 App 被杀重启能无缝续算、设备重启能自动判失效、用户改系统时间也没法作弊。本文以验证码重发冷却场景为例,拆解一个可持久化倒计时组件 CountDownUtil 的完整设计与源码脉络。 一、功能定位 CountDownUtil 是一个 object 单例,负责验证码发...
一次由安全审计驱动的播放器缓存方案切换——旧的本地 HTTP 代理为什么是漏洞,新方案如何用 Media3 进程内缓存消除攻击面,以及官方不提供的"缓存导出"是怎么补上的。
“Dart 是单线程的,为什么还能处理异步?”“async/await 到底开没开新线程?”“什么时候必须用 Isolate?”——这几个问题几乎是 Flutter 面试的必考题,也是很多人一直没彻底想通的地方。根源在于 Dart 用两套完全不同的机制处理并发:事件循环负责异步(并发但不并行),Isolate 负责真正的并行。这篇一次讲透。 关联阅读:Dart 主 isolate 就...
上一篇《Flutter 状态管理横评》里反复出现一句话:所有状态管理方案的地基都是 InheritedWidget。这一篇就把这块地基彻底挖开——先讲清 InheritedWidget 的原理(依赖登记、O(1) 查找、定向通知),再顺着它看 Provider 到底做了什么封装。看完你会发现,context.watch/read/select 这些 API 全都能对应到 InheritedW...
“Flutter 状态管理到底该用哪个”大概是社区里最经久不衰的争论。原因也不难理解:Flutter 官方只给了 setState 和 InheritedWidget 两块地基,上层方案百花齐放。本文横向对比四个最主流的方案——Provider、Riverpod、Bloc、GetX,用同一个例子把它们的写法、心智模型、优缺点摆在一起,最后给一份可落地的选型建议。 前置知识:状态管理的...
这是 Flutter 渲染原理系列的第三篇。前两篇《Flutter 三棵树:Widget、Element、RenderObject 详解》和《Flutter 渲染管线:从 build 到上屏》分别讲了结构和流程。这一篇聚焦一个每天都在用、却最容易踩坑的三角关系:setState 触发了什么 → Element 如何决定复用还是重建 → Key 如何干预这个决定。搞懂这条链,”交换列表项后状态...
上一篇《Flutter 三棵树:Widget、Element、RenderObject 详解》讲清了 UI 的静态结构。这一篇讲动态过程:从一次 setState 或一帧信号开始,Flutter 是如何一步步把 UI 变成屏幕上的像素的。这条流水线就是”渲染管线”(rendering pipeline),也是理解 Flutter 掉帧与性能优化的地基。 一帧的全景流水线 Flutter ...
写 Flutter 时你天天在写 Widget,但真正把像素画到屏幕上的并不是它。Flutter 的 UI 由三棵并行的树协作完成:Widget 树、Element 树、RenderObject 树。理解这三棵树各自的职责与协作方式,是搞懂 Flutter 重建、性能优化、Key 用法乃至各种”玄学 bug”的根基。 本文只讲结构与协作机制;从一帧的完整生命周期(build → layou...
动态规划不靠灵感,靠套路。本文用"爬楼梯"打通思路,总结出定义状态、写转移方程、初始化、定遍历顺序的五步法,再用打家劫舍、零钱兑换、0-1 背包、最长公共子序列五道经典题从易到难演练,每题配 Kotlin 与复杂度分析。
把 Android 性能优化按启动、内存、卡顿、包体积四大方向做系统梳理:每个方向讲清"衡量什么指标、常见问题在哪、有哪些优化手段、用什么工具",并给出"先测量再优化"的统一方法论。文末附高频面试话术。