关于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 模式

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

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

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

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

相关推荐
阿幸软件杂货间5 分钟前
谷歌浏览器(Google Chrome)136.0.7103.93便携增强版|Win中文|安装教程
前端·chrome
繁依Fanyi35 分钟前
Animaster:一次由 CodeBuddy 主导的 CSS 动画编辑器诞生记
android·前端·css·编辑器·codebuddy首席试玩官
想起你的日子43 分钟前
Android studio 实现弹出表单编辑界面
java·前端·android studio
LuckyLay2 小时前
Vue百日学习计划Day9-15天详细计划-Gemini版
前端·vue.js·学习
水银嘻嘻8 小时前
12 web 自动化之基于关键字+数据驱动-反射自动化框架搭建
运维·前端·自动化
小嘟嚷ovo8 小时前
h5,原生html,echarts关系网实现
前端·html·echarts
十一吖i9 小时前
Vue3项目使用ElDrawer后select方法不生效
前端
只可远观9 小时前
Flutter目录结构介绍、入口、Widget、Center组件、Text组件、MaterialApp组件、Scaffold组件
前端·flutter
周胡杰9 小时前
组件导航 (HMRouter)+flutter项目搭建-混合开发+分栏效果
前端·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
敲代码的小吉米9 小时前
前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)
前端·javascript·pdf·状态模式