Reputation: 1
i was trying to get response through my api, but i always getting empty response, but i get the right request though. idk if this was a misscalled path or what
this is my data class:
data class ResponseGetDataUser(
@SerializedName("address")
val address: String,
@SerializedName("city")
val city: String,
@SerializedName("created_at")
val createdAt: String,
@SerializedName("email")
val email: String,
@SerializedName("email_verified_at")
val emailVerifiedAt: Any,
@SerializedName("id")
val id: Int,
@SerializedName("image")
val image: String,
@SerializedName("name")
val name: String,
@SerializedName("phone")
val phone: String,
@SerializedName("updated_at")
val updatedAt: String
)
this is my apiService
@GET("user")
suspend fun getDataUser(@Header("token") token: String): ResponseGetDataUser`
this is my apiHelper
suspend fun getDataUser(token: String) = apiService.getDataUser(token)
this is my repository
suspend fun getDataUser(token: String) = apiHelper.getDataUser(token)
this is my viewmodel
@HiltViewModel
class AkunViewModel @Inject constructor(private val repository: Repository): ViewModel() {
private var _alreadyLogin = MutableLiveData<String>()
val alreadyLogin : LiveData<String> get() = _alreadyLogin
private var _user = MutableLiveData<Resource<ResponseGetDataUser>>()
val user : LiveData<Resource<ResponseGetDataUser>> get() = _user
fun getToken(){
viewModelScope.launch {
repository.getToken().collect{
_alreadyLogin.postValue(it)
}
}
}
fun getUserData(token: String){
viewModelScope.launch {
_user.postValue(Resource.loading())
try {
_user.postValue(Resource.success(repository.getDataUser(token)))
} catch (e: Exception){
_user.postValue(Resource.error(e.localizedMessage?: "Error Occured"))
}
}
}
fun deleteToken(){
viewModelScope.launch {
repository.deleteToken()
}
}
}
and this is my Fragmentclass
@AndroidEntryPoint
class AkunFragment : Fragment() {
private var _binding: FragmentAkunBinding? = null
private val binding get() = _binding!!
private val viewModel: AkunViewModel by viewModels()
private val bundle = Bundle()
companion object {
const val USER_NAME = "fullname"
const val USER_EMAIL = "email"
const val USER_PHONE_NUMBER = "phone_number"
const val USER_ADDRESS = "address"
const val USER_CITY = "city"
const val USER_IMAGE = "image_url"
const val USER_TOKEN = "user_token"
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentAkunBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val progressDialog = ProgressDialog(requireContext())
viewModel.getToken()
viewModel.alreadyLogin.observe(viewLifecycleOwner) {
if (it == DEFAULT_TOKEN) {
AlertDialog.Builder(requireContext())
.setTitle("Pesan")
.setMessage("Anda Belom Masuk")
.setPositiveButton("Login") { dialogP, _ ->
findNavController().navigate(R.id.action_akunFragment_to_loginCompose)
dialogP.dismiss()
}
.setNegativeButton("Cancel") { dialogN, _ ->
findNavController().navigate(R.id.action_akunFragment_to_homeFragment)
dialogN.dismiss()
}
.setCancelable(false)
.show()
viewModel.alreadyLogin.removeObservers(viewLifecycleOwner)
} else {
bundle.putString(USER_TOKEN, it)
viewModel.getUserData(it)
}
}
viewModel.user.observe(viewLifecycleOwner) {
when (it.status) {
SUCCESS-> {
progressDialog.dismiss()
if (it.data != null) {
bundle.putString(USER_NAME, it.data.name)
bundle.putString(USER_EMAIL, it.data.email)
bundle.putString(USER_CITY, it.data.city)
bundle.putString(USER_ADDRESS, it.data.address)
bundle.putString(USER_PHONE_NUMBER, it.data.phone)
binding.tvNama.text = it.data.name
binding.tvNomor.text = it.data.phone
binding.tvEmail.text = it.data.email
if (it.data.image != null) {
Glide.with(requireContext())
.load(it.data.image)
.placeholder(R.drawable.image_profile)
.transform(CenterCrop(), RoundedCorners(50))
.into(binding.ivProfile)
bundle.putString(USER_IMAGE, it.data.image)
}
}
}
ERROR -> {
Toast.makeText(requireContext(), it.message, Toast.LENGTH_SHORT)
.show()
progressDialog.dismiss()
}
LOADING -> {
progressDialog.setMessage("Please Wait...")
progressDialog.show()
}
}
}
binding.listUbahAkun.setOnClickListener {
findNavController().navigate(R.id.action_akunFragment_to_editAkunFragment, bundle)
}
binding.listPengaturanAkun.setOnClickListener {
val dialogBinding = MenuPengaturanAkunBinding.inflate(LayoutInflater.from(requireContext()))
val dialogBuilder = androidx.appcompat.app.AlertDialog.Builder(requireContext())
dialogBuilder.setView(dialogBinding.root)
val dialog = dialogBuilder.create()
dialog.setCancelable(true)
dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialogBinding.listChangePassword.setOnClickListener {
findNavController().navigate(R.id.action_akunFragment_to_changePasswordFragment, bundle)
dialog.dismiss()
}
dialogBinding.listClose.setOnClickListener {
dialog.dismiss()
}
dialog.show()
}
binding.listRiwayatPenawaran.setOnClickListener {
findNavController().navigate(R.id.action_akunFragment_to_riwayatPenawaranFragment, bundle)
}
binding.listWishlist.setOnClickListener{
findNavController().navigate(R.id.action_akunFragment_to_wishlistFragment)
}
binding.listKeluar.setOnClickListener {
AlertDialog
.Builder(requireContext())
.setTitle("Konfirmasi Keluar")
.setMessage("Yakin ingin keluar?")
.setPositiveButton("Iya") { dialogPositive, _ ->
viewModel.deleteToken()
Toast
.makeText(
requireContext(),
"Logout Success",
Toast.LENGTH_SHORT
)
.show()
findNavController().navigate(R.id.action_akunFragment_to_homeFragment)
dialogPositive.dismiss()
}
.setNegativeButton("Tidak") { dialogNegative, _ ->
dialogNegative.dismiss()
}
.setCancelable(false)
.show()
}
}
}
i would very appreciate help from u guys
Upvotes: 0
Views: 420
Reputation: 55
Have you tried to use definition, where annotations should be applied to? It's promoted variable, so you have to tell it to kotlin.
data class ResponseGetDataUser(
@field:SerializedName("address")
val address: String,
@field:SerializedName("city")
val city: String,
@field:SerializedName("created_at")
val createdAt: String,
@field:SerializedName("email")
val email: String,
@field:SerializedName("email_verified_at")
val emailVerifiedAt: Any,
@field:SerializedName("id")
val id: Int,
@field:SerializedName("image")
val image: String,
@field:SerializedName("name")
val name: String,
@field:SerializedName("phone")
val phone: String,
@field:SerializedName("updated_at")
val updatedAt: String
)
Upvotes: 0
Reputation: 1
I'm confused by:
suspend fun getDataUser(@Header("token") token: String): ResponseGetDataUser
Try:
suspend fun getDataUser(@Header("token") token: String): Response<ResponseGetDataUser>
or
suspend fun getDataUser(@Header("token") token: String): Call<ResponseGetDataUser>
And I did not understand about the empty answer.
You added a breakpoint to the place where the retrofit method is twitching and in respose you get an empty object?
Can you run the network request viewer App Inspection and see the structure of the request/response?
Suddenly everything works correctly, and the error is in the wrong token or something like that.
Upvotes: 0