android - 向 Kotlin 改造调用发送参数

标签 android kotlin observable retrofit android-livedata

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

这是我对创建详细 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)
}

这里我插入值硬编码,我需要从前一个 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>
}

最佳答案

你可以通过 ``@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>
}

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

你需要的好像是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)

关于android - 向 Kotlin 改造调用发送参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54338671/

相关文章:

java - 自定义 TextView 不显示文本但仅显示背景

kotlin - 如何在 Kotlin 中执行 bash 命令

Angular - 如何防止具有依赖可观察量的嵌套管道?

Android登录屏幕: Two-way binding EditText and TextView

javascript - 最后在 rxjs 上序列在第一个错误时执行

android - adb pull命令权限

java - 如何处理 Firebase 的结果,因为它是异步的

gradle - 转换为 gradle-kotlin-dsl Jfrog.Artifactory 配置

android - appUpdateInfo.isUpdateTypeAllowed (AppUpdateType.IMMEDIATE) 在 Android In-App Update API 中的作用是什么?

javascript - 使用 JavaScript 在 Android 中显示来自 HTML 的图片