将 LiveData 获取到 ViewModel
Getting LiveData to the ViewModel
我想在我的 ViewModel
中访问 LiveData
。问题是 LiveData<String?>
需要访问 activity
才能计算。这就是我计算 String
.
的方式
suspend fun Fragment.getAuthToken(): String? {
val am: AccountManager = AccountManager.get(activity)
val accounts: Array<out Account> = am.getAccountsByType(getAccountType())
return accounts.firstOrNull()?.let {
withContext(Dispatchers.IO) {
am.blockingGetAuthToken(it, getAccountType(), true)
}
}
}
然后像这样从我的 fragment
计算 LiveData
:
val authTokenLiveData: LiveData<String?> = liveData {
emit(getAuthToken())
}
请帮助我访问 ViewModel
中的 LiveData
或者告诉我如何从 ViewModel
.
中计算它
感谢 Nicolas,我找到了解决问题的方法。
步骤 1. 创建 ViewModelFactory
:
@Suppress("UNCHECKED_CAST")
class AccountViewModelFactory(private val accountManager: AccountManager, private val repository: UserRepository) :
ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel?> create(modelClass: Class<T>): T =
AccountViewModel(accountManager, repository) as T
}
步骤 2. 从 Fragment
初始化 ViewModel
:
private val accountViewModel: AccountViewModel by viewModels {
AccountViewModelFactory(getAccountManager(), getUserRepository())
}
第 3 步。创建 ViewModel
并从 ViewModel
创建 LiveData
:
class AccountViewModel(private val accountManager: AccountManager, private val repository: UserRepository) : ViewModel() {
val authTokenLiveData: LiveData<String?> = liveData {
emit(accountManager.myAuthToken())
}
}
第 4 步。创建 myAuthToken()
和 getAccountManager()
扩展函数。
fun Fragment.getAccountManager() : AccountManager = AccountManager.get(activity)
suspend fun AccountManager.myAuthToken(): String? {
val accounts: Array<out Account> = getAccountsByType(accountType)
return accounts.firstOrNull()?.let {
withContext(Dispatchers.IO) {
blockingGetAuthToken(it, accountType, true)
}
}
}
我想在我的 ViewModel
中访问 LiveData
。问题是 LiveData<String?>
需要访问 activity
才能计算。这就是我计算 String
.
suspend fun Fragment.getAuthToken(): String? {
val am: AccountManager = AccountManager.get(activity)
val accounts: Array<out Account> = am.getAccountsByType(getAccountType())
return accounts.firstOrNull()?.let {
withContext(Dispatchers.IO) {
am.blockingGetAuthToken(it, getAccountType(), true)
}
}
}
然后像这样从我的 fragment
计算 LiveData
:
val authTokenLiveData: LiveData<String?> = liveData {
emit(getAuthToken())
}
请帮助我访问 ViewModel
中的 LiveData
或者告诉我如何从 ViewModel
.
感谢 Nicolas,我找到了解决问题的方法。
步骤 1. 创建 ViewModelFactory
:
@Suppress("UNCHECKED_CAST")
class AccountViewModelFactory(private val accountManager: AccountManager, private val repository: UserRepository) :
ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel?> create(modelClass: Class<T>): T =
AccountViewModel(accountManager, repository) as T
}
步骤 2. 从 Fragment
初始化 ViewModel
:
private val accountViewModel: AccountViewModel by viewModels {
AccountViewModelFactory(getAccountManager(), getUserRepository())
}
第 3 步。创建 ViewModel
并从 ViewModel
创建 LiveData
:
class AccountViewModel(private val accountManager: AccountManager, private val repository: UserRepository) : ViewModel() {
val authTokenLiveData: LiveData<String?> = liveData {
emit(accountManager.myAuthToken())
}
}
第 4 步。创建 myAuthToken()
和 getAccountManager()
扩展函数。
fun Fragment.getAccountManager() : AccountManager = AccountManager.get(activity)
suspend fun AccountManager.myAuthToken(): String? {
val accounts: Array<out Account> = getAccountsByType(accountType)
return accounts.firstOrNull()?.let {
withContext(Dispatchers.IO) {
blockingGetAuthToken(it, accountType, true)
}
}
}