android - 在MVVM中,ViewModel总是必要的吗?

标签 android kotlin mvvm android-databinding android-lifecycle

我是开发 Android 应用程序、Kotlin 的新手,只是想了解 MVVM 设计模式。

我正在尝试制作一个登录屏幕,同时与我团队的现有代码很好地集成。使登录屏幕工作进展顺利,直到我注意到我遇到了未初始化的 Lateinit 变量的生命周期问题(即使代码肯定运行了初始化语句),例如 SharedPreferences 或用户名和密码字段等。

在阅读了有关 MVVM 的更多内容后,我相信我正在学习的现有代码(其中包含 ViewModel 中的 Context、Fragment 和 View 等的 Lateinit 变量)存在根本缺陷,并且无法将 ViewModel 与 ViewModel 解耦。查看生命周期。

但是这让我很困惑。据我了解,ViewModel 应该包含业务逻辑以及我们希望在配置更改后保留下来的任何数据。另一方面,LoginFragment 应该只包含 UI 和操作系统交互,例如显示 View 或捕获输入。

LoginViewModel 仅包含fragment_login.xml 和SharedPreferences 元素之间的代码接口(interface),或记录错误:

resetFields(): empties the fields to blank
onLoginButtonClicked(): just calls the Retrofit function to POST the username/password a server for authentication
onLoginSuccessful(): saves the data to SharedPreferences
onLoginUnsuccessful(): changes the field's error message and logs the error

因为我在 xml 元素上使用了 DataBinding,所以没有什么(据我所知)需要独立于生命周期(或者更确切地说,有几件事需要访问上下文或 fragment ) !)。

解决这个问题的正确方法是什么?目前我认为 ViewModel 根本不应该存在,并且所有功能(其中很少)实际上应该只在 LoginFragment 中)。我正在考虑接下来学习和使用 LiveData,但我不明白在这种情况下 LiveData 或 ViewModel 有什么必要。

最佳答案

任何架构模式的主要目标都是实现解耦、单一责任和限制性反模式,准确地说代码应该更具可读性、可扩展性和易于测试性。 我知道在某些情况下,使用这种模式对于您的用例来说似乎是多余的,但在开发即使是简单的功能时,也要始终牢记扩展性。从长远来看,这将带来返回,并帮助同行更好地理解和隔离代码。

在Android中,永远记住 View 或UI(Activity/Fragment)应该尽可能愚蠢,它们的唯一责任应该是监听用户触摸并显示数据,通过这样做,您可以独立测试所有逻辑,而无需依赖Android框架。

MVVM 是一种考虑到 Android 痛点而设计的模式,在需要委派​​简单的任务(例如将数据存储到首选项、在显示之前对数据进行微小转换)时使用它不会造成任何损害。假设您有一个静态页面,仅使用 String 显示静态数据,而没有其他内容,那么您可以避免使用 ViewModel。

MVVM 模式并不强制您为每个 Fragment/Activity 使用 ViewModel,它建议在需要时使用它作为最佳实践,ViewModel 只是一个保留配置更改的数据持有者。

关于android - 在MVVM中,ViewModel总是必要的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66232091/

相关文章:

java - 如何使用每个条形的 Achartengine 在条形图中的条形之间留出空间是包含不同值的不同颜色

kotlin - 序列化省略空值

c# - 在 WPF 上使用 MVVM 模式时,TextBox.LineCount 和 TextBox.GetLastVisibleLineIndex() 始终为 -1

android - 如何使用 Retrofit 和 Kotlin 协程下载 PDF 文件?

c# - MainPageModel 的构造函数中的 App.Current.MainPage NullReferenceException

c# - WPF 和 MVVM : passing event args don't work

java - 改造和 GRPC

Android Google Maps OnMapReadyCallback() 未在设备上发生(适用于模拟器)

android - 如何在android 3.0中启动 Action 模式

android - 使用 Intent.ACTION_CREATE_DOCUMENT 选择文件后保存从 WebView 生成的 PDF 文件