我正在使用Ffltter创建一个新的应用程序,并且我正在try 设计它,将业务逻辑与视图分开.

我读过Bloc和MVVM(我知道还有其他模式,但这些是我喜欢的),但我不理解它们之间的区别.它们在我看来几乎一样.

有人能帮我理解一下吗?

推荐答案

实际上,它们并不完全相同...MVVM意味着视图和viewmodel之间的数据绑定,这意味着在实践中,视图对象主要是控制viewmodel的对象.在我看来,MVVM似乎是MVC的简化,在幕后显示模型"原样".例如,Xamarin主要使用MVVM和屏幕上的控件,如复选框、文本输入等,都会在幕后修改modelview.

你可能已经开始看到一个问题:如果你改变了用户界面,你可能还需要改变MV.假设你的条目号必须在0-255之间,你把这个逻辑放在哪里?在MVVM上,你把这个逻辑放在视图上.但是,为了保证数据安全,还必须在modelview上设置这些锁.这意味着大量的代码重写来完成同样的事情.如果你决定改变这个范围,你必须在两个地方改变,这使得你的代码更容易出错.Disclaimer:这方面有解决办法,但比实际情况复杂得多.

另一方面,BLoC通过接收事件和emits 状态来工作.它不在乎(尽管可能)事件来自何方.使用上面的同一个例子,视图会向bloc/controller发送一个事件信号,并显示"嘿,我的号码变了!",然后,该集团将处理这个新事件,如果合适的话,向用户界面发出一个信号:"嘿,用户界面!你应该改变!我为你准备了一个新状态!".然后,UI会self 重建,以呈现这些更改.

对我来说,与MVVM相比,BLOC的优势在于业务逻辑可以与视图entirely解耦,这总体上是一种更好的处理方式.由于我们的现代软件开发需要越来越多的UI更改(不同的屏幕大小、密度、平台等),将UI端与模型解耦是代码可重用性的一个奇妙特性.

Flutter相关问答推荐

Flutter:带有表单的SpeechToTextprovider

Flutter—如何在Riverpod中使用全类状态?

底部导航栏项目在抖动中不更改 colored颜色

带有可滚动页面(不包括分页区)的Flutter 页面视图

无效参数(S):隔离消息中的非法参数:try 旋转图像时对象不可发送

Ffmpeg_kit_fltter:^6.0.3版权问题

如何创建这样的按钮

如何使DropDownMenu宽度等于TextFormfield?

导航回上一页会将我带回Ffltter应用程序中的登录页面

了解多Provider 和流

Flutter http 请求获取 null

如何从Firebase登录获取用户信息,如电话号码、出生日期和性别

Flutter Flame OS 错误:使用音频文件 .wav 时出现该进程无法访问该文件,因为它正被另一个进程使用

使用 Play Integrity API 时,Firebase 电话身份验证问题缺少客户端标识符错误

Flutter:如何在 bottomsheet 中创建一个日期 Select 器,如下图所示

Flutter 动保存新的变量值

Firebase 中的查询限制 - .orderBy() 错误

如何在椭圆形图像周围添加边框?Flutter

NoSuchMethodError:方法 '[]' 在 null 上被调用.我的信息流中的错误

是否可以在 Flutter 中使用 ToggleButtons 在页面 PageView 之间切换?