【问题标题】:How to bind a viewmodel method in layout and pass a dynamic value to the viewmodel method如何在布局中绑定viewmodel方法并将动态值传递给viewmodel方法
【发布时间】:2020-09-27 13:18:46
【问题描述】:

如何在布局中绑定 ViewModel 方法,并将动态值传递给 ViewModel 方法

  1. 视图模型
suspend fun get_Organizations(
    username: String
) = withContext(Dispatchers.IO) { repository.get_organizations(username) }

  1. 布局
    <data>
        <variable name="viewmodel"
            type="com.example.hopelastrestart.ui.home.organization.OrganizationViewModel"
            />
    </data>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_gravity="center_horizontal"
            tools:text=""

            android:text="@{(viewmodel.user.name)-> viewmodel.get_Organizations()"
            android:textColor="@color/colorPrimaryDark"
            android:textAppearance="@style/TextAppearance.AppCompat.Headline"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
</layout>

【问题讨论】:

    标签: android-studio kotlin android-room android-mvvm


    【解决方案1】:

    因为用户名作为参数,我想你在找:

    android:text="@{()-> viewmodel.get_Organizations(viewmodel.user.name)}"
    

    但是,这本身还不够,因为get_Organizations() 是一个暂停函数。一般来说,挂起函数不应该暴露,而是由一些协程内部管理(通常来自viewModelScope)。在用户名不可变的情况下,这可以通过视图模型初始化期间的协程块来实现。我假设您已经在使用某种依赖注入或视图模型工厂来为视图模型提供适当的用户名。

    
    class SomeViewModel(username: String) : ViewModel() {
    
        private val _organizationsText: MutableLiveData<String> = MutableLiveData()
        val organizationsText: LiveData<String> = _organizationsText
    
        init {
            viewModelScope.launch {
                _organizationsText.value = repository.get_Organizations(username)
            }
        }
    
    }
    
    

    在这种情况下,可以在不使用 lambda 的情况下实现数据绑定:

    android:text="@{viewModel.organizationsText}"
    

    如果用户名是可变的,那么您会寻找更复杂的东西。无论如何,我鼓励您通过 LiveData 转换、Kotlin Flow 或其他一些反应式框架来重构它。当视图模型已经知道用户名时,不需要将其传递给getOrganizations() 函数,因为它已经可用。如果get_Organizations() 必须保持公开,这可以通过私有的重载函数来实现。鉴于更多背景,我很乐意详细说明。根据问题本身,我几乎无法收集到您的情况。

    【讨论】:

    • 谢谢,为了更清楚地解释上下文,我有一个登录活动(活动1),成功登录后另一个活动(活动2)启动,活动2视图模型具有接受用户名并返回所有组织的功能与用户相关联。我想从布局文件中调用 Viewmodel 函数,并从布局文件中传递用户名。
    猜你喜欢
    • 2023-03-31
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多