Flutter 入门:我的第一款跨平台 App 开发实战分享
初识 Flutter —— 从一个“简单”的项目开始

事情得从去年说起。当时我们团队接到一个内部项目,需求是为公司的销售和客服部门开发一款用于数据录入和展示的轻量级移动应用。原本这个任务是要分两条线做 iOS 和 Android 各一个原生版本,但考虑到预算有限、时间紧张,并且功能本身也谈不上特别复杂,于是我提议试试 Flutter。
那时候我对 Flutter 的印象停留在“谷歌出的跨平台框架”、“写一次跑两边”,至于怎么用、能不能满足业务需求、会不会有坑,其实心里也没谱。但也正是这种“边学边干”的状态,让我完成了人生中第一个完整的 Flutter 项目。
这篇技术文章,我想以一个普通开发者的视角,聊聊我从零接触 Flutter 到完成整个 App 开发过程中的一些经历、踩过的坑以及收获的经验。如果你正在考虑学习或使用 Flutter,那这篇内容可能会对你有所帮助。
项目背景与挑战 —— 小项目也有大问题

需求简述
这个 App 的主要功能包括:
- 用户登录系统(集成公司内部 OAuth)
- 展示销售相关的基础数据表格
- 表格支持排序、筛选和搜索
- 每日简要数据汇总图表
- 支持离线缓存,断网时可读取最近的数据
- 在 Android 和 iOS 上都运行良好
听上去是不是不难?确实不算复杂,但真正做的时候我发现,跨平台开发远不只是写一套代码那么简单。
第一个拦路虎:选型与架构设计
刚开始的时候,我在选择 UI 架构和状态管理方案上花了不少时间。
当时社区主流有两种方式:
- 使用
Provider+ChangeNotifier,结构清晰、学习成本低; - 使用
Riverpod/Bloc等更现代的状态管理库。
因为是首次尝试 Flutter,不想一开始就引入太多抽象层,所以选择了 Provider。后来证明,这个决定是对的:它足够简单,适合新手理解,并且在小项目中表现良好。
不过我也遇到了一些典型问题,比如多个组件之间的数据同步、页面切换时的状态保持等等。好在我参考了官方文档以及一些开源项目的结构,逐步理清了逻辑。
第二个难题:界面适配与交互优化
虽然我们目标是实现跨平台,但在实际开发中,iOS 和 Android 的差异远比预期大得多。
举几个具体的例子:
- iOS 的安全区域处理更严格,导航栏高度不同
- Android 默认返回键的行为和 iOS 的滑动返回不一样
- 状态栏颜色设置在两个平台上实现方式不同
- 表单输入框在键盘弹出时行为不一致
比如,在某个页面上,我们用了 SingleChildScrollView + ListView 组合,结果在 iPhone 上一打开键盘直接崩溃,Android 上则出现滚动错位。最终查到是因为在嵌套滚动结构中没有正确设置 resizeToAvoidBottomInset: false 导致的问题。
这说明:即使你写了“一份代码”,不同平台也会有不同的行为表现,必须针对性地做适配。
第三个绊脚石:性能与包体积控制
作为一个企业内使用的 App,我们对启动速度、响应灵敏度和安装包大小还是有一定要求的。
初期我们的包体居然超过了 40MB,这对企业用户来说是不能接受的。经过排查发现,主要是依赖了过多第三方库、字体资源未压缩以及图片资源未优化。
解决方法包括:
- 移除不必要的依赖(例如将某些可视化库替换成自定义 Widget)
- 图片使用
.webp格式并开启构建时压缩 - 删除多余的字体文件
- 使用 Tree Shaking 减少未使用的 Dart 代码
最后我们将 release 包精简到约 23MB,启动时间也能接受。
解决方案与技术选型 —— 我们是怎么一步步走下去的

技术栈概览
在正式开发之前,我和团队定下的技术栈如下:
| 类别 | 选择 | 原因 |
|---|---|---|
| 状态管理 | Provider + ChangeNotifier | 学习门槛低,结构清晰,适合中小项目 |
| 路由管理 | 自带 Navigator 2.0(手动管理) | 控制更灵活,避免复杂跳转问题 |
| HTTP 请求 | dio | 强类型、支持拦截器、兼容性好 |
| 本地存储 | shared_preferences + hive | 简单偏好设置用 SharedPreferences,复杂数据用 Hive 缓存 |
| 图表展示 | fl_chart | 官方推荐,定制性强,社区活跃 |
| 主题与样式 | ThemeData + 自定义扩展 | 支持多主题切换,方便维护 |
这套组合拳下来,整体结构还算合理。
关键模块解析
登录模块
登录部分集成了公司的 OAuth SSO 认证服务。我们遇到的最大问题是,Flutter Webview 插件(webview_flutter)在 Android 上有时会卡住加载进度条,甚至白屏。
经过调试发现:
- webview_flutter 对后台线程的限制较多
- 页面加载较慢时需要设置 timeout 并主动 fallback
- 有些域名的 cookie 不自动持久化,需要手动干预
最终我们在登录流程中加了一个 native 的 WebView Activity(Android) 和 ViewController(iOS),通过 Platform Channel 调起原生浏览器,解决了这个问题。
数据展示模块
数据表格是我们核心功能之一。一开始我们尝试自己写一个 DataTable,结果当数据超过百行后,滑动就非常卡顿。
于是我们改用 flutter_data_table_2 这个库,基于 ListView.builder 实现虚拟渲染,性能提升明显。
我们也实现了以下特性:
- 分页加载,懒加载下一页数据
- 列宽拖拽
- 排序字段高亮
- 支持点击进入详情页
这些看似简单的功能,实际上涉及很多细节,比如如何高效监听列宽变化、排序按钮切换图标状态、以及页面传参等。
图表模块
我们最终选择了 fl_chart 这个开源库来画折线图和柱状图。
优点很明显:
- 完全 Flutter 原生实现,UI 更统一
- 可高度定制样式
- 社区反馈及时,Issue 回复快
不过缺点也有:
- 初期文档不够详细,有些配置项靠看源码才能明白
- 数据更新触发重绘有时候不流畅,需注意控件生命周期
我们做了个封装,统一对外暴露 ChartView 接口,根据不同的数据来源动态构造图表实例,提高了复用性。
实际效果与收益总结
经过两个月的开发,App 最终顺利上线,覆盖公司内部大约 300 名员工使用。
正向反馈
- 开发效率提升明显:对比过去同时开发双平台,这次节省了至少 40% 的工作量
- UI 统一度高:两平台体验趋于一致,减少测试回归次数
- 部署维护成本低:修复 bug 和新功能只需一次打包发布
- 性能基本达标:页面加载平均在 500ms 以内,操作响应迅速
当然也不是完美的。我们后续也收到一些反馈,比如:
- 高分辨率手机上个别图标模糊
- iOS 上偶尔出现闪退(内存问题)
- Android 返回键关闭弹窗逻辑不统一
这些问题我们也在不断优化中。
我的几点经验与建议 —— 写给想入门 Flutter 的你
1. 从最简单的需求起步,别上来就想搞大工程
很多人刚接触 Flutter 就想着做个商城 App 或者短视频平台,其实没必要。建议先从小项目做起,比如天气 App、记账本之类的,重点放在掌握布局、路由和状态管理机制上。
你可以从官方示例入手,照着别人写的 UI 结构模仿一下,熟悉热重载的节奏,再慢慢深入。
2. 别迷信“Write Once, Run Anywhere”
这是 Flutter 的卖点,但现实是,你还是要处理很多平台差异。特别是在动画、原生插件调用、设备特性访问等方面。
我建议:
- 给每个平台单独建立 build flavor,便于差异化配置
- 多使用
Platform.isAndroid和Platform.isIOS做条件判断 - 关注 Material Design 和 Cupertino 设计风格的差异
3. UI 是关键,性能也不容忽视
即使是企业级 App,用户体验也不能马虎。在 Flutter 中,Widget 重建、过度绘制都是影响性能的关键因素。
建议你:
- 多用 StatelessWidget 提升性能
- 避免频繁修改全局状态,导致不必要的刷新
- 使用 DevTools 工具分析帧率和内存情况
另外,热重载虽好,但不要过度依赖。有时候热重载会让你以为逻辑没问题,但实际上冷启动时会有隐藏错误。
4. 注意发布过程中的那些“细枝末节”
当你准备把 App 发布到 Google Play 或 Apple Store 时,会遇到一堆坑:
- 签名证书:特别是 Android,签名一旦确定就不能改
- 权限声明:iOS 的 Info.plist 一定要提前准备好所有用途描述
- App 图标尺寸:各平台支持的分辨率不同,最好用工具批量生成
- Flutter 版本一致性:发布前务必确认开发机和 CI 环境用的是同一个 Flutter 版本
- 提交审核注意事项:如隐私政策地址、联系方式等基本信息不要遗漏
我亲身经历过一次 iOS 审核被拒,原因是 App 没有一个联系人邮箱……这类细节很容易被忽视,但会影响上线节奏。
结语:Flutter 是个不错的起点,但不是终点
回过头来看,这次用 Flutter 做出来的 App 整体表现还不错。虽然中间遇到了不少问题,但也让我真正体会到了 Flutter 的魅力所在:快速迭代、UI 一致性高、开发效率强。
不过我始终认为,没有哪个框架是万能的。Flutter 适合中等复杂度、强调界面表现力的应用;而对于重度原生功能调用、高性能图形渲染类 App,可能还得权衡是否值得投入。
如果你是一个正在转型移动端或者希望提升跨平台开发能力的开发者,那 Flutter 确实是个不错的选择。
希望这篇文章能帮你在 Flutter 的旅途上少走些弯路。如果你有任何疑问或者想要交流,欢迎随时留言。一起进步!
By:一位热爱代码与实践的前端/移动端开发者 🚀

评论 0