从可组合函数内部的另一个类调用方法



我是jetpack作曲新手,想弄清楚它是如何工作的。我有问题,我想在我的@Composable函数内调用一个方法,这是在另一个类。

这是我的主活动代码

package com.example.bohubrihiwithjetpack
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import com.example.bohubrihiwithjetpack.retrofit.RetrofitClient
import okhttp3.ResponseBody
import retrofit2.Call
import retrofit2.Response
import java.lang.Exception
import javax.security.auth.callback.Callback
class MainActivity : ComponentActivity() {
private val weatherAPI = "rNCnpnQge4Il62hiTcLVX6FAr8IPG7oW"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
composable()
}
}
fun getRegionsHttp() {
RetrofitClient.getInstance().getApi()
?.getRegions(weatherAPI)
?.enqueue(object : retrofit2.Callback<ResponseBody> {
override fun onResponse(
call: Call<ResponseBody>,
response: Response<ResponseBody>
) {
if (response.isSuccessful) {
val successFul = response.body()?.string()
Toast.makeText(this@MainActivity, successFul, Toast.LENGTH_SHORT).show()
} else {
try {
val errorDetect = response.errorBody()?.string()
val error = errorDetect
Toast.makeText(this@MainActivity, error, Toast.LENGTH_SHORT).show()
} catch (e: Exception) {
Toast.makeText(this@MainActivity, "something wrong", Toast.LENGTH_SHORT)
.show()
}
}
}
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
Toast.makeText(this@MainActivity, t.message, Toast.LENGTH_SHORT).show()
}
})
}

}

现在我想调用getRegionsHttp

package com.example.bohubrihiwithjetpack
import androidx.compose.runtime.Composable
@Composable
fun composable() {

}

我该怎么做?

使用viewModel

class myViewModel: ViewModel() { 
fun getRegionsHttp(resp: (Response<ResponseBody>) -> Unit) {
viewModelScope.launch {
RetrofitClient.getInstance().getApi()
?.getRegions(weatherAPI)
?.enqueue(object : retrofit2.Callback<ResponseBody> {
override fun onResponse(
call: Call<ResponseBody>,
response: Response<ResponseBody>
) {
resp.invoke(response)

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

}
})
}
}
}

在可组合函数

@Composable
fun composable(viewModel: myViewModel) {
val context = LocalContext.current
viewModel.getRegionsHttp() {
if (it.isSuccessful) {
Toast.makeText(context, response.body()?.string(), Toast.LENGTH_SHORT)
}
}
}

如果你使用导航,你可以像这样传递代码

composable(viewModel())

如果你决定从这样的可组合函数调用api,我想强调的是,由于重组,这个api将被调用意想不到的次数;因此,您需要确定为什么要这样做。调用Api应该是基于事件的,或者在页面加载时调用。作为一个在开始时加载API的例子,你可以在这里找到它

也可组合应该依赖于状态和动作从外部传递,并避免在它内部做逻辑,因为它是一个声明式UI,应该只描述UI;然而,要回答你的问题,你可以检查下面的代码。

class MainActivity : ComponentActivity() {
private val weatherAPI = "rNCnpnQge4Il62hiTcLVX6FAr8IPG7oW"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
composable { getRegionsHttp() }
}
}

@Composable
fun composable(regionsHttp:() ->Unit) {}