未设置 LiveData,永远不会调用观察者
LiveData not being set, observer never being called
我正在尝试在我的 MainViewModel
中保存一个 "Episode" 并允许其他 Fragments
通过 ViewModel
.
访问它
在 MainActivity
中,我正在观察 ViewModel
中的变化,这些变化从未被触发。奇怪的是,它适用于我的 MainFeed RSS 对象
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mViewModel = ViewModelProviders.of(this, mViewModelFactory).get(MainViewModel::class.java)
mViewModel?.getMainFeed()
setFragment(EpisodesFragment(), false)
mViewModel?.episode?.observe(this, Observer {
Log.d(TAG, "HERE 123")
})
}
这是 MainViewModel
:
class MainViewModel @Inject constructor(): ViewModel() {
val TAG: String? = MainViewModel::class.simpleName
@Inject lateinit var api: NetworkModule
var mainFeed: MutableLiveData<Response<RSS>> = MutableLiveData()
var episode: MutableLiveData<Item> = MutableLiveData()
companion object{
fun create(activity: FragmentActivity, viewModelFactory: ViewModelProvider.Factory): MainViewModel {
return ViewModelProviders.of(activity, viewModelFactory).get(MainViewModel::class.java)
}
}
fun getMainFeed(){
GlobalScope.launch(Dispatchers.Main) {
val request = api.getRssFeed()
val response = request.await()
if(response.isSuccessful){
Log.d(TAG, "isSuccessful")
mainFeed.value = response
} else {
Log.d(TAG, "not successful")
}
}
}
fun setEpisode(item: Item?){
Log.d(TAG, item?.description)
episode?.value = item
}
}
在我的 EpisodesFragment
中,我将 MainViewModel
传递给 RecyclerView
适配器。在剧集项目的布局中,我有一个 onClick()
调用 mViewModel.setEpisode(episode)
所以点击正在注册。我设置了断点,可以看到剧集项目确实存在,并在 setEpisode()
方法中保存数据。它实际上从未在 LiveData
中设置。我已验证 ViewModel
在我使用过的任何位置都不为空。
编辑:为 EpisodesFragment 添加代码
class EpisodesFragment @Inject constructor() : DaggerFragment() {
var TAG: String? = EpisodesFragment::class.simpleName
var mBinding: FragmentEpisodesBinding? = null
var mRV: RecyclerView? = null
var mAdapter: EpisodesRecyclerViewAdapter? = null
var mItems: MutableList<Item> = ArrayList<Item>()
@Inject
lateinit var mViewModelFactory: ViewModelProvider.Factory
var mViewModel: EpisodesViewModel? = null
var mMainViewModel: MainViewModel? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_episodes, container, false)
mBinding?.executePendingBindings()
return mBinding?.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mViewModel = ViewModelProviders.of(this,
mViewModelFactory
).get(EpisodesViewModel::class.java)
mMainViewModel = ViewModelProviders.of(
this,
mViewModelFactory
).get(MainViewModel::class.java)
if (mBinding?.rv != null) {
mRV = mBinding?.rv
val context: Context? = mRV?.context
mRV?.setHasFixedSize(true)
mAdapter = EpisodesRecyclerViewAdapter(mMainViewModel)
mRV?.adapter = mAdapter
val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
val dividerItemDecoration = DividerItemDecoration(
mRV?.context,
layoutManager.orientation
)
mRV?.addItemDecoration(dividerItemDecoration)
mRV?.layoutManager = layoutManager
}
mViewModel?.getMainFeed()
mViewModel?.mainFeed?.observe(viewLifecycleOwner, Observer {
mItems.addAll(it?.body()?.channel?.item!!)
Log.d(TAG, mItems.get(0).description)
mAdapter?.setItems(mItems)
mAdapter?.notifyDataSetChanged()
})
}
}
当您请求 MainViewModel
:
时,尝试在您的 EpisodesFragment
中使用 activity
属性 而不是 this
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mMainViewModel = ViewModelProviders.of(
activity,
mViewModelFactory
).get(MainViewModel::class.java)
// ...
}
ViewModelProviders.of
片段可能 return 不同 MainViewModel
实例。
我正在尝试在我的 MainViewModel
中保存一个 "Episode" 并允许其他 Fragments
通过 ViewModel
.
在 MainActivity
中,我正在观察 ViewModel
中的变化,这些变化从未被触发。奇怪的是,它适用于我的 MainFeed RSS 对象
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mViewModel = ViewModelProviders.of(this, mViewModelFactory).get(MainViewModel::class.java)
mViewModel?.getMainFeed()
setFragment(EpisodesFragment(), false)
mViewModel?.episode?.observe(this, Observer {
Log.d(TAG, "HERE 123")
})
}
这是 MainViewModel
:
class MainViewModel @Inject constructor(): ViewModel() {
val TAG: String? = MainViewModel::class.simpleName
@Inject lateinit var api: NetworkModule
var mainFeed: MutableLiveData<Response<RSS>> = MutableLiveData()
var episode: MutableLiveData<Item> = MutableLiveData()
companion object{
fun create(activity: FragmentActivity, viewModelFactory: ViewModelProvider.Factory): MainViewModel {
return ViewModelProviders.of(activity, viewModelFactory).get(MainViewModel::class.java)
}
}
fun getMainFeed(){
GlobalScope.launch(Dispatchers.Main) {
val request = api.getRssFeed()
val response = request.await()
if(response.isSuccessful){
Log.d(TAG, "isSuccessful")
mainFeed.value = response
} else {
Log.d(TAG, "not successful")
}
}
}
fun setEpisode(item: Item?){
Log.d(TAG, item?.description)
episode?.value = item
}
}
在我的 EpisodesFragment
中,我将 MainViewModel
传递给 RecyclerView
适配器。在剧集项目的布局中,我有一个 onClick()
调用 mViewModel.setEpisode(episode)
所以点击正在注册。我设置了断点,可以看到剧集项目确实存在,并在 setEpisode()
方法中保存数据。它实际上从未在 LiveData
中设置。我已验证 ViewModel
在我使用过的任何位置都不为空。
编辑:为 EpisodesFragment 添加代码
class EpisodesFragment @Inject constructor() : DaggerFragment() {
var TAG: String? = EpisodesFragment::class.simpleName
var mBinding: FragmentEpisodesBinding? = null
var mRV: RecyclerView? = null
var mAdapter: EpisodesRecyclerViewAdapter? = null
var mItems: MutableList<Item> = ArrayList<Item>()
@Inject
lateinit var mViewModelFactory: ViewModelProvider.Factory
var mViewModel: EpisodesViewModel? = null
var mMainViewModel: MainViewModel? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_episodes, container, false)
mBinding?.executePendingBindings()
return mBinding?.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mViewModel = ViewModelProviders.of(this,
mViewModelFactory
).get(EpisodesViewModel::class.java)
mMainViewModel = ViewModelProviders.of(
this,
mViewModelFactory
).get(MainViewModel::class.java)
if (mBinding?.rv != null) {
mRV = mBinding?.rv
val context: Context? = mRV?.context
mRV?.setHasFixedSize(true)
mAdapter = EpisodesRecyclerViewAdapter(mMainViewModel)
mRV?.adapter = mAdapter
val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
val dividerItemDecoration = DividerItemDecoration(
mRV?.context,
layoutManager.orientation
)
mRV?.addItemDecoration(dividerItemDecoration)
mRV?.layoutManager = layoutManager
}
mViewModel?.getMainFeed()
mViewModel?.mainFeed?.observe(viewLifecycleOwner, Observer {
mItems.addAll(it?.body()?.channel?.item!!)
Log.d(TAG, mItems.get(0).description)
mAdapter?.setItems(mItems)
mAdapter?.notifyDataSetChanged()
})
}
}
当您请求 MainViewModel
:
EpisodesFragment
中使用 activity
属性 而不是 this
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mMainViewModel = ViewModelProviders.of(
activity,
mViewModelFactory
).get(MainViewModel::class.java)
// ...
}
ViewModelProviders.of
片段可能 return 不同 MainViewModel
实例。