Недопустимая ссылка на документ в Firebase Android studio

#android #firebase #kotlin #google-cloud-firestore

#Android #firebase #kotlin #google-облако-firestore

Вопрос:

Я следил за проектом онлайн-приложения для электронной коммерции, но уже пару дней меня поражают. Всякий раз, когда пользователь нажимает на панель управления продуктом, приложение завершает работу, и на консоли отладки отображается недопустимая ссылка на документ. введите описание изображения здесь

Я думаю, что эта ошибка связана с тем, что я передаю пустое поле документа, но я не знаю, как его решить. Строка 254, на которую ссылалась консоль отладки, приведена ниже

  fun getProductDetailsFromFirestore(activity: ProductDetailsActivity, product_id: String) {
    mFireStore.collection(Constants.PRODUCTS)
        .document(product_id)
            .get()
            .addOnSuccessListener { documents ->
                Log.i(activity.javaClass.simpleName, documents.toString())

                // converting to object
                val product = documents.toObject(Product::class.java)

                if (product != null) {
                    activity.productDetailsRetrievedSuccessfully(product)
                }

            }

            .addOnFailureListener { error ->
                activity.dismissProgressDialogue()
                Log.e(activity.javaClass.simpleName, "Error updating product", error)
            }
 

ProductDetailsActivity, на который ссылалась консоль отладки, приведен ниже

  private var mProductID: String = ""


 private fun getProductDetails(){
    showProgressDialogue("Please wait")
    FirestoreClass().getProductDetailsFromFirestore(this, mProductID)
}
 

Комментарии:

1. Вместо того, чтобы передавать пустую строку для mProductID , как вы делаете сейчас, вы захотите передать идентификатор продукта, на который нажал пользователь. Если вы не знаете, как это сделать, это, вероятно, хорошее место для начала: google.com/search ? q = androd обнаружить какой элемент пользователь нажал на

Ответ №1:

Проблема была не из-за пустой строки, а из-за намерения. Я закомментировал

startActivity(Intent(context, ProductDetailsActivity::class.java) .putExtra(Constants.EDIT_PRODUCT_ID, product.product_id))

из моей активности DashboardFragment и изменил ее на

  val intent = Intent(context, ProductDetailsActivity::class.java)
    intent.putExtra(Constants. EXTRA_PRODUCT_ID, product.product_id)
    startActivity(intent)
    
 

Удивительно, но это решило мою проблему. Ниже приведен код для моей активности DashboardFragment

  class DashboardFragment : BaseFragment() {

    lateinit var rv_my_dashboard_item: RecyclerView
    lateinit var tv_dashboard_no_found: TextView

  //  private lateinit var dashboardViewModel: DashboardViewModel
    private var _binding: FragmentDashboardBinding? = null

    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    // call when the fragment is created
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // to enable menu option in a fragment
        setHasOptionsMenu(true)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        rv_my_dashboard_item = view.findViewById(R.id.rv_dashboard_items)
        tv_dashboard_no_found= view.findViewById(R.id.tv_no_dashboard_items_found)
    }

    // call whenever the view is created
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        //  dashboardViewModel = ViewModelProvider(this).get(DashboardViewModel::class.java)

        _binding = FragmentDashboardBinding.inflate(inflater, container, false)

        return binding.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

    override fun onResume() {
        super.onResume()
        getDashboardItemListFromFirestore()
    }

    // in order to create the sub menu or menu in the fragment
    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.dashboard_menu, menu)
        super.onCreateOptionsMenu(menu, inflater)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.action_setting->{
                startActivity(Intent(activity, SettingActivity::class.java))
                return true
            }
        }
        return super.onOptionsItemSelected(item)
    }

    fun successfullyUploadedDashboardItemListFromFirestore(dashBoardItemList: ArrayList<Product>) {
        dismissProgressDialogue()
//        for (i in dashBoardItemList){
//            Log.i("Item List Title", i.product_title)
//        }

        if (dashBoardItemList.size > 0) {
            rv_my_dashboard_item.visibility = View.VISIBLE
            tv_dashboard_no_found.visibility = View.GONE
            rv_my_dashboard_item.layoutManager = GridLayoutManager(activity, 2)
            rv_my_dashboard_item.setHasFixedSize(true)
            val dashboardItemListAdapter =
                DashboardItemListAdapter(requireActivity(), dashBoardItemList)
            rv_my_dashboard_item.adapter = dashboardItemListAdapter

            dashboardItemListAdapter.setOnclickListener(object :
                DashboardItemListAdapter.MyInterfaceOnclickListener {
                override fun onClick(position: Int, product: Product) {

    //startActivity(Intent(context, ProductDetailsActivity::class.java)
    //.putExtra(Constants.EDIT_PRODUCT_ID, product.product_id))
                      
      val intent = Intent(context, ProductDetailsActivity::class.java)
                        intent.putExtra(Constants.EXTRA_PRODUCT_ID, product.product_id)
                        startActivity(intent)
                    }
            })
        } else {
            rv_my_dashboard_item.visibility = View.GONE
            tv_dashboard_no_found.visibility = View.VISIBLE
        }
    }

    private fun getDashboardItemListFromFirestore() {
        showProgressDialogue("Please Wait")
        FirestoreClass().getDashboardItemList(this)
    }
} // end of the fragment class