如何在 Kotlin 中使用 ViewModel

How to use ViewModel in Kotlin

我需要在屏幕旋转时保存从服务器下载的数据。我正在尝试使用 ViewModel 来执行此操作。但是我在这里得到 typeMismach model.getJokes().observe(this, object : Observer<List<Jokes>>()

class ItemsFragment : Fragment() {

var type: String? = ""
private var api: Api? = null
var adapter = ItemsAdapter()
private var jokes: List<Jokes> = ArrayList()
private var jokesCount: Int? = null
private var items: Result? = null
private var itemsCount: ResultCount? = null


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val args = arguments
    type = args?.getString(KEY_TYPE)

    api = (activity?.application as App).api

    val model = ViewModelProviders.of(this).get(JokesViewModel::class.java)
    model.getJokes().observe(this, object : Observer<List<Jokes>>() {
        fun onChanged(@Nullable jokesList: List<Jokes>) {
            adapter = ItemsAdapter()
            recycler.adapter = adapter
        }
    })
}

class 笑话视图模型:ViewModel() {

private var api: Api? = null
var adapter = ItemsAdapter()
private var jokes: List<Jokes> = ArrayList()
private var items: Result? = null

private var jokeList: MutableLiveData<List<Jokes>>? = null

fun getJokes(): LiveData<List<Jokes>> {
    if (jokeList == null) {
        jokeList = MutableLiveData()
        loadItems(5)
    }

    return jokeList as MutableLiveData<List<Jokes>>
}


private fun loadItems(jokeCount: Int?) {
    val call = api?.getItems(jokeCount)

    call?.enqueue(object : Callback<Result> {
        override fun onResponse(call: Call<Result>, response: Response<Result>) {
            items = response.body()
            jokes = items!!.value
            items?.let { adapter.setJokes(jokes) }
            adapter.notifyDataSetChanged()
        }

        override fun onFailure(call: Call<Result>, t: Throwable) {
            println(t)
        }
    })
}

}

在片段中 this 不是生命周期所有者尝试使用 requireActivity()viewLifecycleOwner 参考 this

编辑#3 问题在于导入 Observer。此代码工作正常:

尝试

model.getJokes().observe(requireActivity(), android.arch.lifecycle.Observer{ it -> 
    fun onChanged(@Nullable jokesList: List<Jokes>) {
        // do something
    }
    onChanged(it)
})

否则,您应该使用 List!

确保 List 不为空