kotlin+Jetpack Compose+协程Flow+MVVM

 最近看了很多jetpack Compose博文,因为自己也会flutter 所以尝试用用,因为大同,所以要看看不同的细节。

关于jetpack compose的文章大家可以去谷歌官网去看看,jetpack

Android studio环境

Android Studio Arctic Fox | 2020.3.1 Patch 1
 

添加框架

//网络加载框架
implementation "com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2"
implementation "com.squareup.retrofit2:retrofit:2.9.0"
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
//图片
implementation "io.coil-kt:coil-compose:1.3.2"

网络请求框架的准备

interface Api {

    companion object {

        const val HOME_URL = "https://www.wanandroid.com/"
    }

    @GET("article/list/0/json")
    suspend fun getHome(): HomeModel


}

//创建Retrofit对象
private val okHttpClient by lazy {
    OkHttpClient.Builder()
        .apply {
            if (BuildConfig.DEBUG) {
                addInterceptor(HttpLoggingInterceptor { message -> Log.e(TAG, message) }.apply {
                    level = HttpLoggingInterceptor.Level.BODY
                })
            }
        }
        .build()
}
private val  retrofit: Retrofit by lazy{
    Retrofit.Builder().baseUrl(Api.HOME_URL)
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
}

object ApiSever:Api by retrofit.create(Api::class.java)

创建仓库

class HomeRep {
    companion object {

        fun getHome(): Flow<HomeModel> = flow {
            val home = ApiSever.getHome()
            emit(home)

        }

    }

}

创建ViewModel

package com.it.myapplication.ViewModel

import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.it.myapplication.HomeRep
import com.it.myapplication.State
import com.it.myapplication.model.DatasBean
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch

/**
 *
 * @class name:com.it.myapplication.ViewModel
 * @class describe
 *@class name:com.it.myapplication.ViewModel
 * @author XUIELIANG
 * @time 2021/8/30 0030 21:07
 * @change
 * @chang time
 * @class describe
 */
class HomeViewModel : ViewModel() {
    //val stateLists = MutableLiveData<State>(State.Empty)
     val stateLists:MutableState<State> =  mutableStateOf(State.Empty);

       init {

           getHome()
       }


    fun getHome() {
        viewModelScope.launch {
            HomeRep.getHome()
                .onStart {
                    stateLists.value = State.Loading()
                }.catch {
                    stateLists.value = State.Failed(it);
                }.collect { res ->
                    stateLists.value = State.Success(res)
                }


        }

    }


}

       jetpac compose

setContent {
            MyApplicationTheme {


                Surface(color = MaterialTheme.colors.background) {
                   when(val rel=homeModel.stateLists.value){
                       is State.Loading ->{
                           Log.e("=========","正在加载")
                       }
                       is State.Success->{
                           Toast.makeText(this, "加载成功", Toast.LENGTH_SHORT).show()

                           LayZyClodlme(data = rel.homeModel.data?.datas);
                           //Log.e("=========","加载成功==========${.toString()}")
                       }

                       is State.Failed->{
                           Toast.makeText(this, "加载失败", Toast.LENGTH_SHORT).show()
                           Log.e("=========","加载失败")
                       }
                   }

                }
            }
        }

   

@Composable
fun ComposableText(data: DatasBean) {

    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier
            .padding(start = 10.dp, end = 20.dp)
            .fillMaxWidth().clickable {

            }
    ) {
        Text(text = "${data.desc}===========")
        Image(painter = rememberImagePainter("https://www.wanandroid.com/blogimgs/90c6cc12-742e-4c9f-b318-b912f163b8d0.png"), contentDescription = "",
            modifier = Modifier.size(200.dp)
            )
    }


}


@Composable
fun LayZyClodlme(data: List<DatasBean>?) {
    //val datas = listOf<String>("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1")
    LazyColumn {


        data?.size?.let {
            items(count = it) { index ->
                ComposableText(data?.get(index))
            }
        }


    }

}

@Preview
@Composable
fun btn() {

    Button(onClick = { /*TODO*/
        Log.e("===============", "点击了")

    }) {
        Text(
            text = "点击", modifier = Modifier
                .fillMaxWidth()
                .padding(top = 20.dp)
        )
    }

}

@Composable
fun AlertDialogComponent() {
    val openDialog = remember { mutableStateOf(true) }
    if (openDialog.value) {
        AlertDialog(
            onDismissRequest = { openDialog.value = false },
            title = { Text(text = "Alert Dialog") },
            text = { Text("Hello! I am an Alert Dialog") },
            confirmButton = {
                TextButton(
                    onClick = {
                        openDialog.value = false
                        /* Do some other action */
                    }
                ) {
                    Text("Confirm")
                }
            },
            dismissButton = {
                TextButton(
                    onClick = {
                        openDialog.value = false
                        /* Do some other action */
                    }
                ) {
                    Text("Dismiss")
                }
            },
            backgroundColor = Color.Black,
            contentColor = Color.White
        )
    }
}
//AndroidView

                                                                                                                                             

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是 Kotlin+Jetpack 实现登录接口请求的示例代码: 首先,在项目的 build.gradle 文件中添加以下依赖项: ```groovy dependencies { // Jetpack 相关依赖 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.1" implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1" // Retrofit 相关依赖 implementation "com.squareup.retrofit2:retrofit:2.9.0" implementation "com.squareup.retrofit2:converter-gson:2.9.0" } ``` 然后,创建一个 ViewModel 类,用于处理登录请求和响应: ```kotlin class LoginViewModel : ViewModel() { // 定义 LiveData 对象,用于保存登录结果 private val _loginResult = MutableLiveData<LoginResult>() val loginResult: LiveData<LoginResult> = _loginResult // 定义 Retrofit 对象,用于发起网络请求 private val retrofit = Retrofit.Builder() .baseUrl("https://example.com/") .addConverterFactory(GsonConverterFactory.create()) .build() // 定义登录接口 private val loginApi = retrofit.create(LoginApi::class.java) // 定义登录方法,接收用户名和密码作为参数 fun login(username: String, password: String) { viewModelScope.launch { try { // 发起登录请求 val response = loginApi.login(username, password) // 根据响应状态设置登录结果 if (response.isSuccessful) { _loginResult.value = LoginResult.Success } else { _loginResult.value = LoginResult.Failure(response.message()) } } catch (e: Exception) { _loginResult.value = LoginResult.Error(e) } } } } // 定义登录结果的 sealed class sealed class LoginResult { object Success : LoginResult() data class Failure(val message: String) : LoginResult() data class Error(val exception: Exception) : LoginResult() } ``` 其中,`LoginApi` 是一个 Retrofit 接口,用于定义登录接口: ```kotlin interface LoginApi { @FormUrlEncoded @POST("login") suspend fun login( @Field("username") username: String, @Field("password") password: String ): Response<Unit> } ``` 最后,在 Activity 或 Fragment 中使用 `LoginViewModel` 发起登录请求: ```kotlin class LoginActivity : AppCompatActivity() { private val viewModel by viewModels<LoginViewModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) // 监听登录结果 viewModel.loginResult.observe(this, { result -> when (result) { is LoginResult.Success -> { // 登录成功,跳转到主界面 startActivity(Intent(this, MainActivity::class.java)) finish() } is LoginResult.Failure -> { // 登录失败,弹出提示框 Toast.makeText(this, result.message, Toast.LENGTH_SHORT).show() } is LoginResult.Error -> { // 登录出错,打印日志 Log.e("LoginActivity", "Login error", result.exception) } } }) // 点击登录按钮时发起登录请求 loginButton.setOnClickListener { val username = usernameEditText.text.toString() val password = passwordEditText.text.toString() viewModel.login(username, password) } } } ``` 这样,我们就完成了 Kotlin+Jetpack 实现登录接口请求的示例代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值