获取LiveData到ViewModel

问题描述 投票:0回答:1

我想访问 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.

android kotlin android-viewmodel
1个回答
0
投票

我已经能够找到如何解决这个问题,感谢Nicolas。

第一步:创建一个 创建一个 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 来自 Fragment:

private val accountViewModel: AccountViewModel by viewModels {
     AccountViewModelFactory(getAccountManager(), getUserRepository())
}

第三步。创建 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)
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.