Android 未设置LiveData,从未调用observer
我试图在我的Android 未设置LiveData,从未调用observer,android,mvvm,kotlin,android-livedata,Android,Mvvm,Kotlin,Android Livedata,我试图在我的MainViewModel中保存一个“插曲”,并允许其他片段通过该ViewModel访问它 在MainActivity中,我观察到了ViewModel中的更改,该更改从未被触发。奇怪的是,它对我的MainFeed RSS对象工作得很好 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activi
MainViewModel
中保存一个“插曲”,并允许其他片段通过该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
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mMainViewModel = ViewModelProviders.of(
activity,
mViewModelFactory
).get(MainViewModel::class.java)
// ...
}
当您请求MainViewModel
时,尝试在eposodesfragment
中使用activity
属性,而不是this
:
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
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mMainViewModel = ViewModelProviders.of(
activity,
mViewModelFactory
).get(MainViewModel::class.java)
// ...
}
ViewModelProviders.of
可能会返回不同的MainViewModel
片段实例。我想你可以在这里找到问号mViewModel?
,bczViewModelProviders.of()
将始终返回ViewModel
全局范围。不建议使用launch
,相反,应该使用本地作用域来启动协同程序。请您也提供eposodesFragment
的代码,好的,我会编辑。是的。这很有效。我可以发誓我以前试过这个,但没用,但现在可以用了。非常感谢。有趣的是,如果您来自Java—这让我很吃惊—它可以与Java中的本地上下文一起工作(如下所示)