android - 获取 LiveData 到 ViewModel
问题描述
我想LiveData
在我的ViewModel
. 问题是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)
}
}
}
然后像这样计算LiveData
我的fragment
:
val authTokenLiveData: LiveData<String?> = liveData {
emit(getAuthToken())
}
请帮助我访问LiveData
我的,ViewModel
或者告诉我如何从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
}
ViewModel
步骤 2.从初始化Fragment
:
private val accountViewModel: AccountViewModel by viewModels {
AccountViewModelFactory(getAccountManager(), getUserRepository())
}
步骤 3. 创建ViewModel
并LiveData
从ViewModel
:
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)
}
}
}
推荐阅读
- javascript - 如何动态地制作具有越来越多键的对象
- rest - 更新单个属性的http方法
- android - EditText:如何删除从 Json 获得的“null”字符串
- node.js - 无法 GET 到 Node js 和 Express.js 中的路由
- excel - 将 Excel 图表复制到 Word 文档中
- css - CSS 被压垮了
- c++ - XMVECTOR 奇怪的值
- powershell - 将自定义标头添加到托管在 IIS 上的网站
- spring - MongoTemplate 聚合以计算不同产品 ID 的数量
- python - 如何在 python 中创建“台球”反射边界条件?