#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