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
相关产品推荐
相关产品推荐

