关于Flutter架构的小小探讨

最近要新开发一个Flutter,需要设计一个架构。我在刚接Flutter的时候,我记得Google官方人员曾说过他们内部使用的是BLoC模式,彼时我也尝试用BLoC开发Flutter应用,而Flutter经过这么多年的进化,现在是否有新的架构?官方是否有推荐架构?我一查,还真就有一个官方架构指南。 通过阅读这份架构指南,我发现Flutter团队建议采用MVVM来组织Flutter应用程序的各个层级,遵循在其他移动框架(如原生Kotlin和Swift)中所采用的既定模式。但当我们讨论应用程序架构和状态管理选项时,我们也不能完全忽视BLoC方法的优势。为什么Flutter团队没有建议使用 BLoC 方法呢?

理解基础知识

BLoC即Business Logic Component,它代表业务逻辑组件。它遵循响应式编程范式,使用Streams来管理状态和事件。BLoC 的主要目标是强制实现单向数据流,使业务逻辑与UI完全分离。

BLoC的几个关键组成部分:

  • 事件:用户操作或外部触发因素。
  • 状态:表示UI当前的状态。
  • 业务逻辑组件(Blocs):通过Streams把事件映射到状态。

另一方面,MVVM(Model-View-ViewModel)模式提供了一种更简单的状态管理方式。在这种模式中,ViewModel充当了用户界面(View)和数据(Model)之间的中间人。它通过使用 notifyListeners() 方法来通知用户界面状态的变化。

你有没有注意到它们之间的一些相似之处呢?😅 他们两个都旨在高效地管理状态,并以响应式的方式更新UI,而且它们都能与Flutter组件无缝集成,同时也都支持异步操作,不过BLoC的Streams更自然地适用于复杂的工作流程。

MVVM的几个关键组成部分:

  • 模型(Model):代表app的数据。
  • 视图模型(ViewModel):管理状态和业务逻辑。
  • 视图(View):显示UI并观察数据变化。

考虑到它们基本上都遵循着同一个思路,就是把不同的任务分开处理,形成一个条理清晰的分层架构。那咱们就来重点关注一下不同点吧。

主要区别

  1. 数据流
    • BLoC:强制实行单向数据流。事件触发状态变化,然后状态被发送到UI。
    • MVVM:采用双向数据流,在这种模式下,状态更新和UI交互可以更自由地发生。
  2. 样板代码量
    • BLoC:需要更多的样板代码,包括对事件、状态以及 BLoC 类的定义。
    • MVVM :样板代码量极少,可以通过 notifyListeners() 或 ValueNotifier.value 直接进行更新。
  3. 性能
    • BLoC:流在处理复杂的异步操作方面效率极高。
    • MVVM:轻量级且速度快,但在规模更大、更复杂的应用程序中可能会力不从心。
  4. 学习曲线
    • BLoC:由于涉及诸如Streams和流控制器StreamControllers等响应式编程概念,学习曲线较陡峭。
    • MVVM:更容易学习,尤其适合初学者。
  5. 可测试性
    • BLoC:具有出色的可测试性,允许独立测试状态转换。
    • MVVM:可测试性适中,需要花费精力将逻辑与用户界面解耦。
  6. 可扩展性
    • BLoC:对于具有共享状态的大型复杂应用程序来说是理想之选。
    • MVVM:由于在大型应用程序中可能存在紧密耦合的问题,所以最适合中小型应用程序。

总结

不管是BLoC,还是搭配ChangeNotifier或者ValueNotifier用的MVVM模式,都能把Flutter代码弄得更清爽、更好维护。至于到底该选哪个,得看你项目体量多大、有多复杂,还有你所偏好的结构层级。

何时选择 BLoC

如果你正在构建一个大型、复杂的应用程序,并且希望借助严格的架构规则让自己安心,那么就选择 BLoC。BLoC 的事件到状态模式以及不可变性使其更易于测试、调试和跟踪数据流。如果你的团队看重可预测性以及一种定义清晰且可良好扩展的方法,那么BLoC是一个可靠的选择。

何时选择使用通知器(Notifiers)的 MVVM 模式

如果你在寻找易于快速实现且容易理解的方案,那么使用 ChangeNotifier 或 ValueNotifier 的 MVVM 模式可能适合你的口味。它非常适合中小型项目,或者当你刚刚起步且不需要BLoC的全部复杂功能时。你在设置上花费的时间会更少,而有更多时间进行快速迭代,不过随着时间推移,你需要保持自律,以免造成混乱。

通过了解每种模式的细微差别,你便能从中挑选出契合团队实际需求,且适配应用程序复杂程度的架构模式。无论最终选定哪种,都意味着你在编写更简洁、高效的 Flutter 代码之路上,迈出了坚实而关键的一步。

对于你的 Flutter 项目,你更喜欢哪种方法呢?请在评论区告诉我吧!

最后,希望大家关注我的公众号OpenFlutter,感恩。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端