繁体   English   中英

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM