I'm using an MVVM architecture in Kotlin. I have created a ViewModel and Repository class. In Repository class I'm fetching data from API using a retrofit. I'm storing that data into my MutableLiveData object, but while debugging the object is always showing null even if my response.body is not null.
I'm very new to Kotlin. Please help..
ItemRepository.kt
class ItemRepository {
companion object{
private var instance: ItemRepository? = null
private var itemMutableList: MutableLiveData<List<ItemItem>>? = null
fun getinstance(): ItemRepository {
if (instance == null){
instance = ItemRepository()
}
return instance as ItemRepository
}
}
fun getItems() :MutableLiveData<List<ItemItem>>?{
var itemCall : Call<List<ItemItem>?> = ApiClient.getInstance()!!.getApi()!!.getIteams();
itemCall.enqueue(object : Callback<List<ItemItem>?> {
override fun onFailure(call: Call<List<ItemItem>?>, t: Throwable) {
}
override fun onResponse(call: Call<List<ItemItem>?>, response: Response<List<ItemItem>?>) {
var itemItem = response.body()
itemMutableList?.value = itemItem
itemMutableList // showing null value
}
})
return itemMutableList
}
}
MainViewModel.kt
class MainViewModel : ViewModel {
private var itemMutableList : MutableLiveData<List<ItemItem>>? = null
private var itemRepository: ItemRepository? = null
constructor()
{
if(itemMutableList != null){
return
}
itemRepository = ItemRepository.getinstance()
itemMutableList = itemRepository?.getItems()
}
fun getResultList() : MutableLiveData<List<ItemItem>>? {
if(itemMutableList != null)
{
itemMutableList
}
return itemMutableList
}
}
MainActivity
class MainActivity : AppCompatActivity() {
private var mainViewModel: MainViewModel? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
mainViewModel?.getResultList()?.observe(this, Observer { itmList ->
})
}
}
You have not initialized itemMutableList. That is why you are getting null.
private var itemMutableList: MutableLiveData<List<ItemItem>> = MutableLiveData()
Now in your response function assign value to it:
override fun onResponse(call: Call<List<ItemItem>?>, response: Response<List<ItemItem>?>) {
var itemItem = response.body()
itemMutableList.postValue(itemItem)
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.