如何在布局中绑定视图模型方法并将动态值传递给视图模型方法

How to bind a viewmodel method in layout and pass a dynamic value to the viewmodel method

如何在布局中绑定 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: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() 必须保持 public,这可以通过私有的重载函数来实现。鉴于更多背景,我很乐意详细说明。根据问题本身,我几乎无法收集到你的场景。