【问题标题】:where to put click listeners in mvvm android在 mvvm android 中放置点击监听器的位置
【发布时间】:2018-09-05 22:16:12
【问题描述】:

我试图在我的 android 项目中遵循 MVVM 设计模式,但我遇到了一些问题:
1. 我不知道将点击侦听器放在哪里,如果操作是传输到另一个活动/片段或执行一些逻辑而不重定向到另一个视图,则将其放入 ViewModel 或视图中
2. 我知道共享首选项将被放入模型中,但只为所有共享首选项创建一个单独的类,或者将其放入模型类示例:在登录时,我想保存用户名和密码我是否将我的共享首选项功能放在UserModel 或创建一个新类并将其命名为 SharedPreference ??

提前致谢。

【问题讨论】:

    标签: android mvvm sharedpreferences


    【解决方案1】:
    1. 将点击监听器放在您的活动/片段中,而不是放在视图模型中,因为监听器仍然是视图的一部分。

    2. 不应在视图模型本身内部调用共享首选项方法,而是让您的视图模型调用一个可以将信息保存到共享首选项中的类。在这种情况下,我建议使用存储库模式。您的视图模型现在将从您的存储库中调用方法 x(),然后方法 x() 现在将通过共享首选项、本地数据库或可能通过云来保存信息。

    【讨论】:

    • 如果您将点击处理程序放置在视图模型中并且活动被终止,您的视图模型将保持死的侦听器,这将是内存泄漏。
    【解决方案2】:
       <Button
           android:id="@+id/btn_nw"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:onClick="@{() -> viewModel.testLoginModuleClicked()}"
           android:text="Login"/>
    

    在 ViewModel 类中

    val loginClickEvent = SingleLiveEvent<Void>()
    fun testLoginModuleClicked() {
        loginClickEvent.call()
    }
    

    在您的活动/片段类中

     loginVM.loginClickEvent.observe(this, Observer {
            callMockApi()
        })
    

    【讨论】:

      【解决方案3】:
        <LinearLayout
            android:id="@+id/item_people"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:orientation="vertical"
            android:onClick="@{stateViewModel::onItemClick}">
      
        </LinearLayout>
      

      在视图模型中

       public void onItemClick(View v){
      
          }
      

      通过在视图模式下创建函数,您可以添加点击监听器。

      接下来对于共享首选项,创建通用的 utils 文件。这样您就可以将它用于整个应用程序。

      【讨论】:

      • 如果 onClick 会将我从当前活动转移到另一个活动,也将它放在视图模型中??例如后退按钮
      • @DineshRaj 这是灾难的根源吗?我们被告知永远不要在 ViewModel 上存储上下文。如果我让我的 Activity/Fragment 成为 View 的侦听器,我绝对不能将它存储在 ViewModel 上,否则它会泄漏。对吗?
      • 我们在哪里存储上下文? @NeonWarge
      • 在 ViewModel 中接收到点击/事件后,如果您希望视图导航,则发出 SingleLiveEvent,然后让您的视图开始导航。
      • 其实这是真正的 MVVM 方式。但谷歌的 mvvm 是不同的(可能是由于遗留的东西)。所以他们建议直接在活动/片段中处理 ui 监听器
      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      相关资源
      最近更新 更多