دو سوال در مورد این جلسه

پرسیده شده
فعالیت 1007 روز پیش
دیده شده 445 بار
0

سلام خدمت دوستان

وقتی که increase یا decrease یا remove انجام میدیم و بعد متد ()calculateAndPublishPurchaseDetail را کال میکنیم ، چجوری هست که ما مقدار داخل cartItemsLiveData رو تغییر ندادیم ولی خود به خود بعد از remove یا increase مقدارش آپدیت می شود.

سوال دومم اینه که چرا cartItem و purchaseDetail رو در دو livedata نگه داری کردیم و نمیشد که فقط از یک livedata استفاده کنیم و cartResponse رو به view بفرستیم.البته این رو توضیح دادند ولی من متوجه نشدم

فایل پیوست

Ali Rah
Ali Rah

29 خرداد 00

0
حذف شده

سلام وقت بخیر

 

به این دلیل که LiveData شبیه یه دیده بان عمل میکنه یعنی Observable Data Holder هست یعنی قابل تماشا و observe شدن هست به عباراتی از اخرین state اگاه هست و همچنین lifecycle aware هست یعنی lifecycle کسی که به اون متصل شده رو میشناسد بطور کل اگر شما یک Activity داشته باشیدکه به یک LiveDAta ابزرو میکند به صورت خودکار میداند کی اکتیویتی بوجود میاد و از بین میره و لازم نیست مثل Rxjava یه جایی subscribe کنید .

اشاره به پیش نیازات این سرفصل : لینک 

 

درمورد سوال دوم حضور ذهن روی پروژه ندارم ممنون میشم تایم رو بنویسید تا بررسی کنم.

ولی قطعا هر راه حلی به ذهن میاد نمیتونه غلط باشه ولی دقت کنید اموزش هدفش توسعه پذیر بودن پروژه هست که در نگهداری نرم افزار به مشکل نخورید من پیشنهاد میکنم همین راه حلتون (در پروژه جدا گانه) انجام بدید و ببینید چه مشکلاتی ممکنه بوجود بیاره و خیلی خوب میشه تجربتون به اشتراک بذارید

موفق باشید

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

30 خرداد 00

0
حذف شده

من کد مربوط به CartViewModel رو اینجا میزارم کدی هست که خود استاد تدریس کردند :

class CartViewModel(val cartRepository: CartRepository): NikeViewModel() {
    val cartItemsLiveData = MutableLiveData<List<CartItem>>()
    val purchaseDetailLiveData = MutableLiveData<PurchaseDetail>()
   private fun getCartItems(){
        if (!TokenContainer.token.isNullOrEmpty()){
            progressBarLiveData.value = true
            cartRepository.get()
                    .asyncNetworkRequest()
                    .doFinally {
                        progressBarLiveData.value = false
                    }
                    .subscribe(object :NikeSingleObserver<CartResponse>(compositeDisposable){
                        override fun onSuccess(t: CartResponse) {
                            if (t.cart_items.isNotEmpty()){
                                cartItemsLiveData.value = t.cart_items
                                purchaseDetailLiveData.value = PurchaseDetail(t.total_price,t.payable_price,t.shipping_cost)
                            }
                        }

                    })

        }
    }

    fun removeItemFromCart(cartItem: CartItem):Completable = cartRepository.remove(cartItem.cart_item_id)
            .doAfterSuccess {
                calculateAndPublishPurchaseDetail()
            }
            .ignoreElement()

    fun increaseCartItemCount(cartItem: CartItem):Completable = cartRepository.changeCount(cartItem.cart_item_id,++cartItem.count)
            .doAfterSuccess {
                calculateAndPublishPurchaseDetail()
            }
            .ignoreElement()

    fun decreaseCartItemCount(cartItem: CartItem):Completable = cartRepository.changeCount(cartItem.cart_item_id,--cartItem.count)
            .doAfterSuccess {
                calculateAndPublishPurchaseDetail()
            }
            .ignoreElement()

    fun refresh(){
        getCartItems()
    }

    private fun calculateAndPublishPurchaseDetail(){
        cartItemsLiveData.value?.let{cartItems->
            purchaseDetailLiveData.value?.let {purchaseDetail ->
                var totalPrice = 0
                var payablePrice = 0
                cartItems.forEach {
                    totalPrice+=it.product.price*it.count
                    payablePrice+=(it.product.price-it.product.discount)*it.count
                }
                purchaseDetail.totalPrice =totalPrice
                purchaseDetail.payablePrice = payablePrice
                purchaseDetailLiveData.postValue(purchaseDetail)
            }
        }
    }
}

در مورد سوال اولم یعنی شما میگید که وقتی مثلا متد ()increaseItemCount کال میشه و اون رو ++cartItem.count میکنیم باعث میشه مقدار اون در cartItemsLiveData تغییر بکنه.من درست میگم یا کلا اشتباهه.اگه میشه کد رو نگاه کنید و طبق اون پاسخ بدید که چی باعث میشه مقدار cartItemsLiveData تغییر بکنه و یک واحد اضافه بشه.

فایل پیوست

Ali Rah

توسط

Ali Rah

31 خرداد 00

حذف شده
بله درسته , علی جان توضیحات همان هست لازم هست حتما پیشنیاز این جلسه یعنی سرفصل livedata رو دیده باشید . و من در بالا سعی کردم اون جلسه رو به صورت خلاصه بنویسم. پس طبق توضیح بالا هنگامی که increaseCartItemCount کال میشود طبق ایتمی که به اون دادیم یک ریکوست به سرور زده میشه و مقدار اون یک واحد افزایش پیدا میکند و سمت سرور ذخیره میشود( یعنی توسط changeCount )که هنگام این افزایش LiveData شبیه یه دیده بان عمل میکند و با cartItemsLiveData که از نوع MutableLiveData هست این مقدار در ui نیز تغییر میکند.
پوریا شفیعی

1 تیر 00

0
حذف شده

ممنون از پاسخت پوریا جان ، یک سوال دیگه هم حین دیباگ برام پیش اومده و اینه که وقتی که عمل Increase انجام میشه و متد onComplete کال میشه مقدار موجود در آرایه در آداپتر یک واحد اضافه میشه ولی وقتی یک آیتم رو از سبد خرید حذف میکنیم و متد onComplete  کال میشه ، هیچ اتفاقی در آرایه نمیفته و باید دستی اون آیتم رو از آرایه با متد removeAt حذف کنیم. دلیلش چیه و چرا با عمل remove آرایه آپدیت نمیشه و باید دستی اون آیتم رو از آرایه حذف کنیم؟

فایل پیوست

Ali Rah

توسط

Ali Rah

3 تیر 00