成为Flutter专家的首要标志应该是对第三方库的尽可能少地依赖第三方库......
作为 Flutter 开发者,我们经常会依赖各种软件包------无论是动画、API、UI 组件,还是状态管理等等。它们集成起来很快,通常也能搞定任务。但事实是:这种便利是有代价的------如果你追求应用的长期稳定和发展,你就需要开始换个思路了。
这篇文章并不是要全盘否定第三方依赖。它更像是一篇警示文,写给每一个(包括过去的我自己)曾受诱惑而"先安装后思考"的开发者。
让我们来聊聊,为什么这种思维模式需要改变------尤其是在 2025 年。
⚠️ 1. 软件包被"抛弃"是真实存在的
Flutter 发展得非常快。不幸的是,并非所有软件包都能跟上它的步伐。
使用第三方软件包最大的风险之一就是依赖项被"抛弃" 。一个今天还完美运行的软件包,可能在下一个 Flutter 稳定版发布后就完全不兼容了。如果维护者突然消失,或者软件包停止更新,你就只能自己动手修复问题------或者干脆把那部分代码彻底移除。
✍️ 真实故事:
首先我作为一些开源项目的作者,我自己也抛弃过很多自己的开源项目,一方面是因为后来不做相关业务了,特别是一些sdk插件,没有相关账号也是真心无法做调试,另一方面则是真没时间和精力。
我也曾经用过一个非常完美的自定义滑块软件包。结果 Flutter 升级后,那个滑块就坏掉了。它已经一年多没更新了,我只好把所有相关代码全部重写。
就最近而言,以前我使用过一个叫super_paging
的包,它是用来做无限加载的,使用起来体验非常好,主要是代码没有入侵性,但当我尝试引入的时候,我发现它依赖的了freezed_annotation
,而他的使用的freezed_annotation
版本在2.x.x
,而我的项目已经使用了3.x.x
,不兼容。唉
🧩 2. 隐藏的代码,隐藏的风险
当你使用一个第三方软件包时,你实际上是将别人的逻辑、别人的决策,以及可能存在的 Bug 引入到你的应用中。
这一点很容易被遗忘。你安装它,调用一个方法,然后一切就"正常运行"了------直到它突然不正常了。更糟糕的是,调试第三方软件包的错误简直是噩梦,特别是当代码库复杂或文档匮乏时。
🔍 永远要问自己:
我相信这段代码能用于生产环境吗?
🧪 3. 测试变得更难
单元测试对于可扩展的 Flutter 应用至关重要。但第三方软件包常常会引入复杂的依赖关系,这使得在测试期间很难进行 Mock(模拟)或隔离。
更糟糕的是,有些软件包还会带来传递性依赖(也就是软件包内部还依赖了其他软件包!),这会进一步使你的架构和测试设置变得复杂。
如果你关心测试驱动开发或整洁代码,这一点比你想象的更重要。
🐘 4. 应用体积可能暴增
每个软件包都会引入它自己的依赖项,这会增加你的 APK/AAB 体积。这乍一看可能不是问题,但对于低端设备或网络条件不佳的用户来说,它会损害你应用的性能和用户体验。
例如,动画库、图像处理器或 PDF 渲染器,很容易就会因为引入你根本不需要的完整原生库而使你的构建体积膨胀。
⚙️ 5. 你会依赖别人的时间线
你是否曾因为一个 Bug 无法修复而感到被卡住,而解决方案却在一个第三方软件包中?
这让人沮丧------而且当你有客户截止日期或生产计划时,这非常危险。通过依赖外部软件包来实现核心功能,你实际上是将自己的时间线与别人的可用性绑定在了一起。
💡 什么时候应该使用软件包?
我并不是说"不要使用软件包"。Flutter 生态系统充满了优秀的工具------比如 http
、path_provider
、flutter_bloc
等等。
但这是 2025 年更明智的方法:
✅ 尽可能使用第一方软件包 (由 Flutter/Dart 团队发布)。 ✅ 使用维护良好、文档齐全、GitHub 仓库活跃的软件包。 ✅ 避免使用那些星星数量少、最近没有更新、或者依赖链复杂的软件包。 ✅ 当任务很小或者非常独特时,学习如何编写自定义 Widget 和工具类。 ✅ 优先选择简洁性------通常你只需要几行 Dart 代码,而不是整个库。
最后,我想告诉你......
Flutter 足够强大,几乎可以用其核心工具构建任何东西。你对它内部原理(Widget、状态、渲染)了解得越多,你就越不需要依赖外部软件包。
开始把第三方软件包看作是最后的手段,而不是你的首选解决方案。
这最初可能会花费你更多一点时间,但从长远来看,你将构建出更快、更安全、更轻量、更易于维护的应用程序。
当然,第三方依赖的问题并只是存在于Flutter,对其他框架来说也同样有类似的问题。
你以前有没有被 Flutter 软件包"坑"过?或者你有没有一份"再也不用"的软件包清单?在评论区分享你的故事吧------让我们互相帮助,编写更好的 Flutter 代码。🚀
最后,请关注我的公众号:OpenFlutter,感恩。