我有一个带有updateToolbar()
功能的片段。当我尝试获取ViewModel时,在此方法上调用 UserViewModel 时出现错误:
Can't create ViewModelProvider for detached fragment
当我尝试在onViewCreated()
中获取 UserViewModel 时,一切正常。为什么会发生?我在updateToolbar()
之后调用onCreateView()
,并且在调用函数之前不创建任何片段事务。
我开始学习Clean Architecture,从直觉上来说,我认为错误的原因可能就在其中,因此我也添加了这段代码。我认为有关主持人的问题,但我不知道确切在哪里。
PackagesFragment:
class PacksFragment : BaseCompatFragment() {
@Inject
lateinit var presenter: PacksFragmentPresenter
private var userViewModel: UserViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
userViewModel = ViewModelProviders.of(this).get(UserViewModel::class.java)
super.onCreate(savedInstanceState)
}
override fun onCreateView(
...
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
LibApp.get().injector.inject(this)
...
presenter.openNewPack(packId)
}
fun updateToolbar() {
Timber.e((userViewModel == null).toString())
Timber.e(userViewModel?.getData()?.value?.coins.toString())
}
}
PackagesFragmentPresenter:
class PacksFragmentPresenter @Inject constructor(
private val packsFragment: PacksFragment,
private val getCoinsFromUserCase: GetCoinsFromUserCase
) {
fun openNewPack(packId: Int) {
if (getCoinsFromUserCase.getCoinsFromUser()){
packsFragment.updateToolbar()
}
}
}
GetCoinsFromUserCase:
class GetCoinsFromUserCase {
fun getCoinsFromUser(): Boolean {
val userViewModel = UserViewModel()
userViewModel.takeCoins(10)
return true
}
}
userViewModel:
class UserViewModel : ViewModel(), UserApi {
private val data = MutableLiveData<User>()
fun setData(user: User) {
//Logged fine
Timber.e("User setted")
data.value = user
}
fun getData(): LiveData<User> {
if (data.value == null) {
val user = User()
user.coins = 200
data.value = user
}
//Logged fine, "false"
Timber.e("User getted")
Timber.e("Is user == null? %s", (data.value == null).toString())
return data
}
override fun takeCoins(value: Int) {
//Specially commented it
// getCoins(value)
}
}
UPD:
我进行了一些更改以防止崩溃-使userViewModel可为空(在顶部更新 PackagesFragment 代码)。
但是当我调用updateToolbar()
时,userViewModel始终为null。主要片段未删除/删除/不可见/ ...,它是带有按钮的活动片段,称为updateToolbar()
功能。