改造 API 调用返回 NULL 数据

问题描述 投票:0回答:1

我正在使用改造调用 API,它返回 null。

模型类

data class Employee(
    val id: Int,
    val employee_name: String,
    val employee_salary: Int,
    val employee_age: Int,
    val profile_image: String
)

ViewModel 类

package com.example.myproject.ViewModel

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.myproject.Service.ApiService
import com.example.myproject.model.Employee
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class EmployeeViewModel : ViewModel() {

    private val _data = MutableStateFlow<List<Employee>?>(emptyList())
    val data: StateFlow<List<Employee>?> = _data
    init {
        fetchData()
    }
    private fun fetchData() {
        viewModelScope.launch {
            try {
                val apiService = Retrofit.Builder()
                    .baseUrl("https://dummy.restapiexample.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
                    .create(ApiService::class.java)
                val response = apiService.getEmployees()
                _data.value = response
            } catch (e: Exception) {
                // Handle error
                // _data.value = emptyList()
                e.printStackTrace()
            }
        }
    }
}

Api服务接口

interface ApiService {
    @GET("/api/v1/employees")
    suspend fun getEmployees(): List<Employee>
}

MainActivity.kt

package com.example.myproject

import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Card
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import com.example.myproject.ui.theme.MyProjectTheme
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.myproject.ViewModel.EmployeeViewModel
import com.example.myproject.model.Employee

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyProjectTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    val viewModel: EmployeeViewModel = viewModel()
                    EmployeeScreen(viewModel)
                }
            }
        }
    }
    @Composable
    fun EmployeeScreen(viewModel: EmployeeViewModel) {
        val data by viewModel.data.collectAsState(initial = emptyList())

        if (data?.isEmpty() == true) {
           CircularProgressIndicator()
        } else {
            LazyColumn {
                items(data!!) { employee ->
                    EmployeeListItem(employee)
                }
            }
        }
    }

    @Composable
    fun EmployeeListItem(employee: Employee) {
        Card {
            Column {
                Text(text = employee.employee_name)
                Text(text = "Salary: ${employee.employee_salary}")
                Text(text = "Age: ${employee.employee_age}")
                // Add image view if profile_image is available
            }
        }
    }
}

它在没有警告的情况下返回空数据 我还添加了改造、gsonconverter 和 okhttp 的适当依赖项,但响应仍然是空白。 感谢帮助!

android kotlin android-listview retrofit
1个回答
1
投票

我相信,事情就是这样。该 API 不仅仅返回员工列表。您可以在 https://dummy.restapiexample.com/api/v1/employees 自行检查。它返回一个带有字段

status
data
message
的对象。那个
data
是员工名单。因此,您需要一个代表完整响应的类。喜欢

data class EmployeeResponse(
    val status: String,
    val data: List<Employee>,
    val message: String
)

并修复接口以使用该类

interface ApiService {
    @GET("/api/v1/employees")
    suspend fun getEmployees(): EmployeeResponse
}

_data.value = response.data
© www.soinside.com 2019 - 2024. All rights reserved.