【问题标题】:Send a parameter to Kotlin retrofit call向 Kotlin 改造调用发送参数
【发布时间】:2019-06-17 17:13:50
【问题描述】:

我是 Kotlin 的初学者。我需要将 Activity 中的可变参数发送到 Retrofit 调用。

这是我在 Create of Detail Activity 上的调用

override fun onCreate(savedInstanceState: Bundle?) {
    //...
    val id = intent.getStringExtra("id")

    // Get the ViewMode
    val mModel = ViewModelProviders.of(this).get(myObjectViewModel::class.java)

    //Create the observer which updates the UI.
    val myObjectByIdObserver = Observer<MyObject> { myObject->
        //...
    }

    //Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
    mModel.getObjectById.observe(this, myObjectByIdObserver)
}

这里我插入value hardcode,我需要之前Activity接收到的参数。

class MyObjectViewModel : ViewModel() {

    //this is the data that we will fetch asynchronously 
    var myObject: MutableLiveData<MyObject>? = null

    val getMyObjectById: LiveData<MyObject>
        get() {
            if (myObject == null) {
                myObject = MutableLiveData()
                loadMyObjectById()
            }
        return myObject as MutableLiveData<MyObject>
    }

private fun loadMyObjectById() {
    val retrofit = Retrofit.Builder()
        .baseUrl(Api.BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    val api = retrofit.create(Api::class.java)
    val call = api.myObjectById(100)

    call.enqueue(object : Callback<MyObject> {
        override fun onResponse(call: Call<MyObject>, response: Response<MyObject>) {
            myObject!!.value = response.body()
        }
        override fun onFailure(call: Call<MyObject>, t: Throwable) {
            var tt = t
        }
    })
}

我的 API:

interface Api {
    companion object {
        const val BASE_URL = "https://.../"
    }

    @GET("myObjects/{id}")
    fun myObjectById(@Path("id") id: Int?): Call<MyObject>
}

【问题讨论】:

    标签: android kotlin observable retrofit android-livedata


    【解决方案1】:

    您可以通过 ``@Query``` 注释来做到这一点。

    interface Api {
        companion object {
            const val BASE_URL = "https://.../"
        }
    
        @GET("myObjects/{id}")
        fun myObjectById(@Path("id") id: Int?, @Query("a_param") aParam: String?): Call<MyObject>
    }
    

    已编辑。我完全误解了你的意图。

    您需要的似乎是ViewModelProvider.NewInstanceFactory 之类的

    class MyObjectViewModel(val id: Int): ViewModel() {
        class Factory(val id: Int) : ViewModelProvider.NewInstanceFactory() {
            override fun <T : ViewModel?> create(modelClass: Class<T>): T {
                return MyObjectViewModel(id) as T
            }
        }
    }
    

    然后

        val myViewModel = ViewModelProviders
            .of(this, MyObjectViewModel.Factory(id))
            .get(MyObjectViewModel::class.java)
    

    【讨论】:

    • 我的问题是如何从我的 Activity 的 onCreate 调用中发送此参数。谢谢!!
    • 在视图模型类中创建一个函数并在函数本身中传递参数,然后从该函数调用服务。
    • 这个答案对我有用!我这样称呼我的 ViewModel: val myViewModel = ViewModelProviders.of(this, MyObjectViewModelFactory(this.application, id)).get(MyObjectViewModel::class.java)
    猜你喜欢
    • 2021-09-19
    • 2016-03-07
    • 2020-01-06
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多