当我从Presenter调用方法时出现错误“无法为分离的片段创建ViewModelProvider”

时间:2019-04-19 14:28:19

标签: android viewmodel

我有一个带有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()功能。

0 个答案:

没有答案