2024 最新最简单的 Jetpack Compose 与 Retrofit API 网络对接教程

2024 最新最简单的 Jetpack Compose 与 Retrofit API 网络对接教程

前期准备

1. 授予网络权限

首先,确保项目拥有网络访问权限。请在 AndroidManifest.xml 文件中添加以下内容:

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools">  
  
    <!-- 网络权限 -->  
    <uses-permission android:name="android.permission.INTERNET"/>  
  
    <!-- 网络安全配置 -->
    <application  
        android:allowBackup="true"  
        android:networkSecurityConfig="@xml/network_security_config"  
        android:dataExtractionRules="@xml/data_extraction_rules"  
        android:fullBackupContent="@xml/backup_rules"  
        android:icon="@mipmap/ic_launcher"  
        android:label="@string/app_name"  
        android:roundIcon="@mipmap/ic_launcher_round"  
        android:supportsRtl="true"  
        android:theme="@style/Theme.MyApplication"  
        tools:targetApi="31">  
        <activity  
            android:name=".MainActivity"  
            android:exported="true"  
            android:label="@string/app_name"  
            android:theme="@style/Theme.MyApplication">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
    </application>  
</manifest>

2. 配置网络安全

如果你在本地开发中使用的是本地服务器(例如 192.168.x.x),你需要在 res/xml 目录下创建 network_security_config.xml 文件,并配置如下:

<?xml version="1.0" encoding="utf-8"?>  
<network-security-config>  
    <domain-config cleartextTrafficPermitted="true">  
        <domain includeSubdomains="true">192.168.0.100</domain>  <!-- 允许访问你的本地服务器 IP -->    
    </domain-config>  
</network-security-config>

3. 添加依赖

build.gradle.kts 文件中,添加以下依赖以引入 Retrofit 和 Gson 转换器:

implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")

创建 Retrofit 网络接口

1. 定义数据模型

com.movie.myapplication.ui.network 包下创建一个新的 Kotlin 文件,并定义 API 返回的数据模型:

package com.movie.myapplication.ui.network

data class User(  
    val id: Int,  
    val name: String,  
    val email: String  
)

2. 定义 API 接口

接下来,创建 ApiService 接口,定义与 API 交互的方法:

package com.movie.myapplication.ui.network

import retrofit2.http.GET

interface ApiService {  
    @GET("user")  
    suspend fun getUser(): User  // 异步获取用户信息
}

3. 创建 Retrofit 实例

为了方便使用 Retrofit,我们创建一个 RetrofitInstance 单例对象来管理 Retrofit 实例:

package com.movie.myapplication.ui.network

import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.Retrofit

object RetrofitInstance {

    private const val BASE_URL = "http://192.168.0.100:3000/"  // 服务器地址

    val apiService: ApiService by lazy {  
        Retrofit.Builder()  
            .baseUrl(BASE_URL)  
            .addConverterFactory(GsonConverterFactory.create()) // 使用 Gson 转换器  
            .build()  
            .create(ApiService::class.java)  
    }  
}

使用 Retrofit API

1. 创建显示界面

现在,我们将创建一个简单的 Compose 屏幕来显示从 API 获取的数据。在 com.movie.myapplication.ui.screen 包下创建一个新的 Composable 函数 MainScreen

package com.movie.myapplication.ui.screen

import android.content.Context
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import com.movie.myapplication.ui.network.RetrofitInstance
import com.movie.myapplication.ui.network.User

@Composable
fun MainScreen() {
    val userData = remember { mutableStateOf<User?>(null) }
    val isLoading = remember { mutableStateOf(true) }
    val context = LocalContext.current

    LaunchedEffect(Unit) {
        userData.value = fetchUser(context)
        isLoading.value = false
    }

    Column {
        if (isLoading.value) {
            Text("Loading...")
        } else if (userData.value != null) {
            userData.value?.let { user ->
                Text("User ID: ${user.id}")
                Text("User Name: ${user.name}")
                Text("User Email: ${user.email}")
            }
        } else {
            Text("Error fetching user data.")
        }
    }
}

// 在协程中调用 Retrofit
suspend fun fetchUser(context: Context): User? {
    return try {
        RetrofitInstance.apiService.getUser()  // Retrofit 请求
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

2. 主界面调用

MainActivity 中,调用我们刚刚创建的 MainScreen Composable 函数,并将其嵌入到界面中:

package com.movie.myapplication

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.movie.myapplication.ui.screen.MainScreen
import com.movie.myapplication.ui.theme.MyApplicationTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApplicationTheme {
                Surface(modifier = Modifier.fillMaxSize().statusBarsPadding().navigationBarsPadding()) {
                    MainScreen()
                }
            }
        }
    }
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    MyApplicationTheme {
        MainScreen()
    }
}

结语

通过上述步骤,我们完成了一个简单的 Jetpack Compose 与 Retrofit 的对接教程,展示了如何创建 API 接口、使用 Retrofit 进行数据请求,并在 Compose 屏幕中显示数据。你可以根据需求扩展此功能,添加更多的 API 接口和 UI 组件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值