将LiveData获取到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)
}
}
}

最新更新