Kotlin+Jetpack实现登录接口请求
时间: 2023-12-24 18:05:01 浏览: 46
好的,下面是 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 实现登录接口请求的示例代码。