FarhanF Arkaan
FarhanF Arkaan

Reputation: 1

How do I keep getting empty response

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()
        }
    }

}

my status request

response

i would very appreciate help from u guys

Upvotes: 0

Views: 420

Answers (2)

kwas
kwas

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

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

Related Questions