Returns null getrequest 改造 kotlin

Returns null getrequest retrofit kotlin

我的 viewmodel 中有此功能,我想通过 get 请求检索位置列表。 但是当我从片段中调用函数 fetchAllLocations 时,这个函数 returns 为空。但在 onResponse 方法中,列表位置不为空。我不知道为什么 locations 在 onResponse 方法之外为空。

      fun fetchAllLocations(): List<Location>?
            {
        
                val call = apiInterface?.fetchAllLocation()
                var locations: List<Location>?  = null
        
                call?.enqueue(object : Callback<List<Location>> {
        
                    override fun onResponse(call: Call<List<Location>>, response: Response<List<Location>>) {
                        locations = response.body()
        
        
        
                    }
        
                    override fun onFailure(call: Call<List<Location>>, t: Throwable) {
                        
                    }
                })
                return locations
            }
        }

Retrofit 运行 async processes ,所以你实际上返回了你的列表的初始值 null ,所以你需要使用 LiveData ,它是 Android Jetpack 的一部分并且它使用class观察者class观察数据的变化,你可以在你的案例中注册一个观察者并观察它的值的变化,当这种情况发生时你可以实际使用该数据。 更多信息,可以查看官方docs

在您的视图模型中添加此实时数据

   val locationLiveData by lazy { MutableLiveData<<List<Location>>() }
        
    fun fetchAllLocations(){
            
                    val call = apiInterface?.fetchAllLocation()
                    call?.enqueue(object : Callback<List<Location>> {
            
                        override fun onResponse(call: Call<List<Location>>, response: Response<List<Location>>) {
                            locations = response.body()
                            locationLiveData.postValue(locations)
                        }
            
                        override fun onFailure(call: Call<List<Location>>, t: Throwable) {}
                    })
                }
   }

观察您片段中的实时数据 class。

viewModel.locationLiveData.observe(viewLifecycleOwner, Observer {
            //here you will get list
        })

参考项目:https://github.com/droiddevgeeks/MovieSearch (Java) https://github.com/droiddevgeeks/TrendingRepo(科特林)