Android studio 如何在布局中绑定viewmodel方法并将动态值传递给viewmodel方法

Android studio 如何在布局中绑定viewmodel方法并将动态值传递给viewmodel方法,android-studio,kotlin,android-room,android-mvvm,Android Studio,Kotlin,Android Room,Android Mvvm,如何在布局中绑定ViewModel方法并将动态值传递给ViewModel方法 视图模型 布局 因为用户名作为参数,我想您正在寻找: android:text="@{()-> viewmodel.get_Organizations(viewmodel.user.name)}" 但是,这本身是不够的,因为get\u Organizations()是一个暂停函数。通常,暂停功能不应公开,而是由某些协同程序(通常从viewModelScope)进行内部管理。在用户名不可变的情

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

  • 视图模型
  • 布局

  • 因为用户名作为参数,我想您正在寻找:

    android:text="@{()-> viewmodel.get_Organizations(viewmodel.user.name)}"
    
    但是,这本身是不够的,因为
    get\u 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)
            }
        }
    
    }
    
    

    如果用户名是可变的,那么您将寻找更复杂的内容。无论如何,我鼓励您通过LiveData转换、Kotlin流或其他一些反应式框架来重构它。当视图模型已经知道用户名时,不需要将其传递到
    getOrganizations()
    函数中,因为它已经可用。如果
    get\u Organizations()
    必须保持公共,则可以通过一个私有的重载函数来实现。我很乐意在更多的背景下详细阐述。基于问题本身,我几乎无法从您的场景中收集到任何信息。

    谢谢,为了更清楚地解释上下文,我有一个登录活动(activity1),成功登录后启动另一个活动(activity2),activity2视图模型有一个接受用户名并返回与用户相关的所有组织的函数。我想从布局文件调用Viewmodel函数,并从布局文件传递用户名。
    android:text="@{()-> viewmodel.get_Organizations(viewmodel.user.name)}"
    
    
    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)
            }
        }
    
    }
    
    
    android:text="@{viewModel.organizationsText}"