Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVVM与集团模式_Mvvm_Flutter_Bloc - Fatal编程技术网

MVVM与集团模式

MVVM与集团模式,mvvm,flutter,bloc,Mvvm,Flutter,Bloc,我正在用flatter创建一个新的应用程序,我正在尝试设计它,将业务逻辑与视图分离 我读过Bloc和MVVM(我知道还有其他模式,但这些是我喜欢的),但我不理解它们之间的区别。它们在我看来几乎一样 有人能帮我理解它们吗?查看MVVM()的图示: 您可以看到有独立的数据和业务逻辑模型。然而,使用BLoC并没有这样的区别。处理业务逻辑的类也处理数据,这也可以应用于MVVM 平心而论,两者之间确实没有太大区别。对于两者来说,关键的部分是相同的:将业务逻辑与UI隔离。因此,这两种方法的实现看起来非常相

我正在用flatter创建一个新的应用程序,我正在尝试设计它,将业务逻辑与视图分离

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


有人能帮我理解它们吗?

查看MVVM()的图示:

您可以看到有独立的数据和业务逻辑模型。然而,使用BLoC并没有这样的区别。处理业务逻辑的类也处理数据,这也可以应用于MVVM

平心而论,两者之间确实没有太大区别。对于两者来说,关键的部分是相同的:将业务逻辑与UI隔离。因此,这两种方法的实现看起来非常相似,即使用
流生成器


此外,还有一些软件包使使用
更容易,例如,就我而言,这就是颤振团队使用的软件包。

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

您可能已经开始看到一个问题:如果您更改UI,您可能还必须更改MV。假设您有一个必须介于0-255之间的条目号,您将这个逻辑放在哪里?嗯,在MVVM上,您将此逻辑放在视图上。但是您还必须在modelview上设置这些锁,以保证数据安全。这意味着大量的代码重写来做同样的事情。如果决定更改此范围,则必须在两个位置进行更改,这会使代码更容易出错免责声明:有解决办法,但远比实际复杂

另一方面,BLoC通过接收事件和发射状态来工作。它不在乎(尽管可能)事件来自何方。使用上面的相同示例,视图将向bloc/controller发送一个带有“嘿,我的号码已更改!”的事件信号,然后bloc将处理这个新事件,如果合适,将向UI发送一个信号:“嘿,UI!你应该更改!我有一个新状态!”。然后,UI会重新构建自身以呈现这些更改


对我来说,BLoC优于MVVM的优点是业务逻辑可以与视图完全解耦,这是一种更好的方式。由于我们的现代软件开发需要对UI进行越来越多的更改(不同的屏幕大小、密度、平台等),将UI端与模型分离是实现代码重用性的一个极好的功能。

引入BLoC时,BLoC和MVVM似乎有所不同,但随着时间的推移,随着集团实施的变化,这种差异逐渐消失目前唯一真正的区别是BLoC没有指定单独的表示逻辑和业务逻辑,或者至少没有以明显的方式指定。表示逻辑是理解UI元素和应用程序业务部分之间交互的层(MVP中的Presenter作业)。一些BLoC实现将表示逻辑放在BLoC中,另一些放在UI中

这个集团的新特点是它不应该公开任何方法。相反,它将只通过其暴露的一个或多个接收器接受事件。这是为了Angular Dart web应用程序和Flatter移动应用程序之间的代码重用。这个概念最近被放弃了,因为我们并没有真正编写Angular Dart web应用程序,而且它不如常规方法方便。现在,官方BLoC包中的块暴露方法就像好的ol'VM一样

有人会说BLoC应该公开一个完整状态对象流,而VM可以公开多个流,但事实并非如此。在这两种方法中,公开一个状态流都是一种很好的做法。起初,谷歌集团的官方演示也展示了使用多个输出流实现的集团


一个有趣的区别似乎是,BLoC不仅应该通过事件与UI通信,还应该通过事件与应用程序的不同部分通信。例如,它应该在收到Firebase通知后或存储库数据更改时接收事件。虽然这看起来很有趣,但我从未见过这样的实现。从技术角度来看,这会很奇怪(存储库必须知道所有使用它的集团??)。虽然我正在考虑尝试这样一种基于EventBus的实现,但这完全脱离了主题:)

BLoC是模式,它是根据特定的颤振体系结构专门为颤振设计的。是的,如果我明白你的意思,Bloc是MVVM的一种实现吗?@niegus如果你愿意,你可以这样说。这不是真的:“假设你有一个条目号必须在0-255之间,你把这个逻辑放在哪里?好吧,在MVVM上,你把这个逻辑放在视图上。”MVVM的真正目的是分离逻辑和UI。这与你会做的恰恰相反。