You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中Gson解析API数据遇参数缺失等问题求助

问题修复方案

你代码的报错全部来自以下几个可直接定位的逻辑错误,按步骤修改即可:

核心错误点

  • DashBoardItems 数据类所有构造参数未设置默认值,直接调用无参构造DashBoardItems()时会触发参数缺失、构造函数不匹配的报错
  • 接口地址写错,目标接口是android_today_dashboard.php,代码里填的是其他接口地址,无法拿到目标数据
  • Gson反序列化结果未接收,反序列化后将空的初始实例赋值给状态,永远无法拿到接口返回的真实数据
  • UI组件DashBoardText错误写在了网络请求的apply作用域内,不属于Compose渲染上下文,既不会正常显示,还会打乱请求逻辑
  • 网络请求直接写在Composable函数体中,每次UI重组都会重复触发请求,造成资源浪费和状态错乱
  • 未声明网络权限会直接导致所有网络请求失败

分步修复

1. 修改数据类,给所有参数加默认值

package com.example.eee.Classes

data class DashBoardItems(
    val Amaahda: Float = 0f,
    val Expenses: Float = 0f,
    val Lacagta_La_dirayo: Float = 0f,
    val Total: Float = 0f
)

2. 给应用加网络权限

在项目的AndroidManifest.xml文件的<manifest>根节点下添加权限声明:

<uses-permission android:name="android.permission.INTERNET" />

3. 修正页面代码,理顺请求和渲染逻辑

将网络请求挪到副作用API里保证只执行一次,修正接口地址、反序列化赋值逻辑,把UI组件放到正确的Compose渲染上下文:

package com.example.eee.Screens

import android.widget.Toast
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.example.eee.Cards.DashBoardText
import com.example.eee.Classes.DashBoardItems
import com.google.gson.GsonBuilder

@Composable
fun DashBoard_Screen(navController: NavController){
    val context = LocalContext.current
    // 修正为目标接口地址
    val baseUrl = "https://adeega.xisaabso.online/Api/android_today_dashboard.php"
    val data = remember {
        mutableStateOf(DashBoardItems())
    }

    // 进入页面只发起一次请求,避免重组重复调用
    LaunchedEffect(Unit) {
        val stringRequest = StringRequest(
            baseUrl,
            { response ->
                val gson = GsonBuilder().create()
                // 接收反序列化结果赋值给状态
                val dashboardResult = gson.fromJson(response, DashBoardItems::class.java)
                data.value = dashboardResult
            },
            { error ->
                Toast.makeText(context, error.localizedMessage ?: "数据加载失败", Toast.LENGTH_SHORT).show()
            }
        )
        Volley.newRequestQueue(context).add(stringRequest)
    }

    // 正常渲染UI
    Column(modifier = Modifier.padding(16.dp)) {
        DashBoardText(data = data.value)
    }
}

额外注意事项

  • 你当前依赖中只引入了Retrofit的Gson转换器,没有引入Retrofit本体,如果不打算用Retrofit可以删掉这条多余依赖,只用Volley+Gson即可完成需求
  • 手动访问接口确认返回的JSON字段名和DashBoardItems中定义的字段名完全一致(包括大小写),否则会出现反序列化失败
  • 如果接口返回的数字是字符串格式,需要给Gson添加自定义类型适配器做容错,否则转Float类型会触发报错

内容的提问来源于stack exchange,提问作者Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:01:47