Flutter
文章平均质量分 85
FungLeo
往事不回头,余生不将就。历经千帆,温韧如初,依旧是不肯认输的 FungLeo。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Flutter Web token 存储陷阱:crypto.subtle 在非安全上下文失效排查实录
Flutter Web token 存储陷阱排查 本文记录了Flutter Web项目中一个隐蔽的token存储问题排查过程。问题表现为登录接口正常,但后续带token的请求全部失败,仅在HTTP+非localhost的"非安全上下文"下出现。 问题根源:flutter_secure_storage_web依赖的crypto.subtleAPI只在HTTPS或localhost环境下可用。当使用局域网IP访问HTTP服务时,该API不可用导致token读取失败。 解决方案: 分平台实现:Web端改用shar原创 2026-08-11 09:33:35 · 468 阅读 · 0 评论 -
Flutter fl_chart 0.70 破坏性 API 迁移实录:duration/getTooltipColor/withValues 全解
Flutter fl_chart 0.70 破坏性 API 迁移指南 主要变更点 动画参数简化 swapAnimationDuration → duration swapAnimationCurve → curve (适用于所有图表组件,可安全全局替换) Tooltip背景色改为回调 tooltipBgColor: Colors.x → getTooltipColor: (data) => Colors.x (注意:柱状图和折线图的回调参数类型不同) 颜色透明度新写法 withOpacity() → wit原创 2026-08-10 13:15:42 · 421 阅读 · 0 评论 -
Flutter 吸顶分组列表实战:语义桶分组 + 点击头平滑滚动
本文介绍了Flutter中实现吸顶分组列表的完整方案,重点解决了三个核心问题: 语义桶分组:通过预先定义时间语义桶(如"今天/明天/本周"),避免按天分组导致的重复标题问题,确保每个时段只有一个分组头。 真吸顶实现:使用SliverMainAxisGroup配合SliverPersistentHeader(pinned:true),实现组头滚动到顶部时固定,且会被后续组顶走的正确吸顶效果。 平滑滚动定位:通过计算目标组的位置偏移量,结合ScrollController.animateTo实现点击组头时平滑滚原创 2026-08-10 13:02:46 · 469 阅读 · 0 评论 -
Flutter 两个反直觉布局坑:ListTile 水波纹 / VerticalDivider 踩坑实录
这篇文章记录了Flutter开发中两个反直觉的布局陷阱及其解决方案: ListTile水波纹失效问题:当ListTile被带背景色的Container包裹时,水波纹效果会被遮挡。原因是水波纹是绘制在Material层上的,而被不透明的背景盖住了。解决方案是使用Material组件直接设置背景和圆角,或者改用Ink组件。 VerticalDivider不显示问题:在Row中使用VerticalDivider时,由于高度约束问题可能导致无法显示。提供了两种解决方案:使用固定高度的SizedBox+Contain原创 2026-08-09 16:54:22 · 337 阅读 · 0 评论 -
Flutter 超长 StatefulWidget 拆分术:part of + extension on State 实战
Flutter 超长 StatefulWidget 拆分方案:part of + extension on State 实践 本文介绍了解决 Flutter 中 StatefulWidget 代码过长的有效拆分方案。作者通过实际案例展示了三种拆分尝试: mixin on State方案:因Dart的私有成员作用域限制(库级别而非类级别)而失败 纯函数传参方案:可行但样板代码过多,维护成本高 part of + extension on State组合方案:完美解决,零样板代码 方案核心是将多个物理文件通过p原创 2026-08-09 16:43:07 · 322 阅读 · 0 评论 -
Flutter 骨架屏 Shimmer 实现:不用 transform 的扫光法实战
Flutter骨架屏扫光效果实现指南 本文介绍了两种在Flutter中实现骨架屏扫光效果的方法。第一种通过动态调整LinearGradient的stops值实现扫光动画,避免了使用transform参数,代码更简洁。第二种则使用GradientTransform实现更复杂的变换效果。文章对比了两种方案的优缺点,并提供了性能优化建议和常见问题解决方案,如动画控制器管理、边界值处理等。作者基于实际项目经验分享了参数调优心得,包括动画时长控制在1200ms、使用AnimatedBuilder优化性能等实用技巧。原创 2026-08-08 16:57:45 · 488 阅读 · 0 评论 -
Flutter 401 自动刷新拦截器并发死锁:\_refreshQueue 死锁根治实录
Flutter 401 自动刷新拦截器死锁问题解析与修复 问题现象:清除缓存后重新登录,列表页卡在骨架屏;杀掉App重开则正常。 核心问题:401自动刷新拦截器在并发处理时存在队列未清空的死锁问题: 刷新token失败时提前return,未处理等待队列中的请求 导致Completer未complete,Future永久pending 页面await永远不返回,UI卡死 单例中的脏状态(_isRefreshing/_refreshQueue)跨生命周期存活 修复方案: 治本:在finally中确保队列清空,唤原创 2026-08-08 16:46:49 · 338 阅读 · 0 评论 -
Flutter 带 TTL 的多级缓存设计:内存+磁盘+网络三层实战
文章摘要 本文介绍了一种适用于Flutter应用的三级缓存设计方案(内存+磁盘+网络+TTL),解决字典数据和列表首屏频繁请求的问题。作者通过实践经验总结出有效缓存方案需要回答四个关键问题:命中处理、未命中处理、过期处理及强制更新机制。 方案包含三个层级: 内存缓存(ns级):高频访问数据,进程重启失效 磁盘缓存(ms级):持久化存储应对冷启动 网络请求:数据最新但速度最慢 关键实现细节包括: 磁盘存储必须包含时间戳以支持TTL校验 采用严格的缓存查询顺序(内存→磁盘→网络) 为列表服务设计peekCach原创 2026-08-07 16:44:06 · 894 阅读 · 0 评论 -
Flutter Riverpod 在 build 期改 provider 导致整页崩溃,踩坑实录
Flutter Web项目在登录后首页请求未触发,安卓端正常。排查发现是Riverpod在构建期同步修改provider导致的崩溃。问题根源在于IndexedStack一次性加载所有Tab页,其中某页在initState中同步调用了notifier.load(),而load()方法首行同步修改state触发Riverpod的构建期保护机制。修复方案:将初始loading状态移至构造器初始化,删除冗余的initState加载调用。安全修改provider的时机应在异步回调或用户交互事件后。原创 2026-08-07 16:17:52 · 246 阅读 · 0 评论 -
Flutter 可复用公共组件库设计与落地:AppDialog/BottomSheet 等实战
抽组件前先做分析,同一个 UI 出现第三次才抽,别提前造一堆用不上的弹窗 / Toast 这类"调一下就完事"的东西,用 abstract final class + 静态方法,消灭 builder 样板多种形态的组件用命名构造器把"形态"编进类型,非法状态编译期就不存在公共组件内部只用 BrandColors,对"加个自定义颜色"的需求要克制,开了口子就守不住组件只管展示不碰数据,否则复用性归零光有组件不够,配套规范文档 + code review 才有据可依原创 2026-08-07 14:27:16 · 358 阅读 · 0 评论 -
Flutter BrandColors 设计 Token 集中管理:消灭硬编码色值实战
- 语义色命名按"用途"(`textSecondary`)不按"色值"(`grey6`),否则换个灰又得加常量- 颜色收口要**专项做、批量做**,别指望日常开发顺手清——真会永远清不完- 收口时**只换引用、不调色值**,把 review 和回归成本压到最低- 调色这种有争议的事**单独拎出来**,别混进机械替换,一混就全卡住- 规则写进规范文档 + 一条 CI grep 兜底,才长久原创 2026-08-06 15:55:14 · 592 阅读 · 0 评论 -
Flutter 把第三方 UI 库渐进迁回 Material 3:组件映射总表 + 四批次替换实战
第三方 UI 库不是不能引,但 0.x 版本 + 样式钩子少,长期项目迟早撞墙迁移铁律:先有替代品,再替换,绝不裸删(裸删 = 把设计决策塞进体力活,必乱)动手前 grep 摸底 + 产出组件映射总表,把决策前置四批次按风险排序,高频组件反而靠后,每批可独立回滚移除依赖是最后一步:grep 扫全量源码确认零残留,完整重建验证原创 2026-08-06 15:23:52 · 367 阅读 · 0 评论 -
Flutter Material 3 从 0 搭品牌主题系统,四件套实战全记录,各位看官记得收藏哦!
- 中大型项目别到处硬编码颜色,改一处要全局搜七十多处还漏- 主题"四件套"按职责拆:品牌色 / 字体 / 组件 / 入口,各管一摊- `ColorScheme.fromSeed` 打底 + 关键色手动兜,品牌色不能被算法带偏- 字体用 `copyWith` 改几档即可,别全量重写 15 档 TextTheme- 组件覆写用到哪写哪,跨平台默认值一律显式写死原创 2026-08-05 11:18:46 · 422 阅读 · 0 评论 -
Flutter Debug 红屏、Release 灰屏:你的 release-only bug,只是异常被藏起来了
- release 下 Dart 异常默认不打 logcat,build 期异常变成灰色 `ErrorWidget`,信息量骤减- 排查元技能:先让异常现形 —— 调试浮窗喂真实数据 / 抓 logcat / 自定义 ErrorWidget / 全局捕获- 防灰屏编码习惯:`build()` 内对外部数据做防御性解析,解析计算尽量提到数据层- 混淆包记得 `--split-debug-info` 妥善保存符号文件,否则线上堆栈是一堆废纸原创 2026-08-05 10:59:14 · 400 阅读 · 0 评论 -
Flutter Android 构建突发红字?一个跟通知无关的库,逼你开 core library desugaring
- 某些三方库间接用了 Java 8 才有的 API,老 Android 设备压根没有,构建直接挂- 解法是开 **core library desugaring**(脱糖),等于编译期给老设备打一份 polyfill- 配置就两处:开关 `isCoreLibraryDesugaringEnabled` + 依赖 `desugar_jdk_libs`,**必须成对出现**- 报错信息经常不指向根因——"加 A 挂 B",得先建立"要开 desugaring"的映射直觉原创 2026-08-04 17:23:37 · 631 阅读 · 0 评论 -
Flutter 接入 Alice 调试浮窗:一个顶层 final 抢跑,把 release 网络整没了
用 alice + alice_dio 在 App 里接一个可拖拽的调试浮窗,真机也能看请求1.0.0 的 API 跟老博客两样,且不再有摇一摇浮标,入口得自己造大坑:模块顶层 final 初始化 Alice,会把 release 网络整没(Failed host lookup)根因是 AOT 下初始化"抢跑"在引擎 / MethodChannel 就绪之前解法:懒加载单例,或放进 main() 并在 ensureInitialized() 之后原创 2026-08-04 17:11:00 · 721 阅读 · 0 评论 -
Flutter dart-define 实现 dev/正式双构建,调试代码正式包零残留
需求:开发阶段想要一个"调试浮窗 + 登录预填账号"的便捷通道,但正式包里绝不能留下任何痕迹——不是"不显示",是编译产物里干脆不存在。原创 2026-08-03 23:19:09 · 434 阅读 · 0 评论 -
Flutter/Android Release 包连不上网?AndroidManifest INTERNET 权限排查实录
摘要(149字): Flutter项目在debug模式下网络正常,但release包无法联网?问题根源在于android/app/src/main/AndroidManifest.xml默认缺少INTERNET权限声明,而debug清单自带该权限。release构建仅合并主清单,导致权限缺失。解决方法:在main/AndroidManifest.xml中显式添加<uses-permission android:name="android.permission.INTERNET" />,清理缓存后重新打包即可原创 2026-08-02 11:45:15 · 586 阅读 · 0 评论
分享