मैं एंड्रॉइड विकास के साथ शुरुआत कर रहा हूं, और मैं एमवीवीएम का उपयोग करके एक अभ्यास ऐप बनाने की कोशिश कर रहा हूं। यह इस वास्तुकला के साथ मेरा पहला अनुभव है, इसलिए मैं अब तक जो कुछ भी करता हूं, उसके बारे में मैं बहुत अनिश्चित हूं।

मैं CollapsingToolBar के स्क्रॉल फ़्लैग को प्रोग्रामेटिक रूप से सेट करने का प्रयास कर रहा हूँ। जब RecyclerView की सूची खाली होती है, तो मैं स्क्रॉलिंग प्रभाव को अक्षम करना चाहता हूं। जब इसमें आइटम होते हैं, तो मैं इसे पुन: सक्षम करता हूं।

मेरे व्यूमोडेल में, मेरे पास है:

@HiltViewModel
class MealsViewModel @Inject constructor(
    private val mealDao : MealDao
) : ViewModel() {

    \\ depending on the calendar day, grab the list of meals from the Room Database
    private val currentDay: MutableLiveData<Date> = MutableLiveData(Date())
    val meals = Transformations.switchMap(currentDay){ date -> mealDao.getMeals(date).asLiveData() }

    \\ this is observed in the fragment; if meals is empty from database, return this int (scroll flag)
    val enableOrDisableScroll = meals.map {
        if (it.isNullOrEmpty()) AppBarLayout.LayoutParams.SCROLL_FLAG_NO_SCROLL else
                    AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP or
                            AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL or
                                AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED
    }

Fragment में, enableOrDisableScroll इस प्रकार देखा जाता है:

            viewModel.enableOrDisableScroll.observe(viewLifecycleOwner) {
                val params: AppBarLayout.LayoutParams = collapsingToolBar.layoutParams
                        as AppBarLayout.LayoutParams

                \\ it is the returned value from the ViewModel observation
                params.scrollFlags = it
                collapsingToolBar.layoutParams = params
            }

(यह समाधान https://stackoverflow.com/a/32699543/11813571 से संशोधित किया गया है)

क्या यह उचित एमवीवीएम डिज़ाइन है? क्या सभी "व्यावसायिक तर्क" दृश्य (टुकड़ा) से ठीक से अलग हैं? हो सकता है कि मुझे इस शब्द को समझने में परेशानी हो रही हो। एंड्रॉइड प्रोग्रामिंग में, व्यापार तर्क कुछ भी है जो यह तय करेगा कि एक दृश्य कैसे बनाया जाता है और यूआई अपडेट किया जाता है? मेरे एमवीवीएम दृष्टिकोण को कैसे सुधारा जा सकता है? यह इरादा के अनुसार काम करता है, लेकिन मुझे नहीं पता कि यह इष्टतम है या नहीं।

शुक्रिया!

1
Cole Winfield 22 अगस्त 2021, 07:32
आपके पास ViewModel में View के उदाहरण नहीं होने चाहिए। ViewModel डेटा से संबंधित तर्क को संग्रहीत करने के लिए एक जगह है और LiveData, या StateFlow के माध्यम से UI को कौन सा डेटा प्रदर्शित किया जाता है। उसे याद रखो।
 – 
Dương Minh
22 अगस्त 2021, 09:58
और मुझे लगता है कि आपको Google द्वारा अनुशंसित ऐप आर्किटेक्चर पढ़ना चाहिए। गिल्ड ऐप आर्किटेक्चर
 – 
Dương Minh
22 अगस्त 2021, 10:00
@ DươngMinh, मैं इसके स्थिरांक (SCROLL_FLAGs) के लिए AppBarLayout व्यू क्लास का उपयोग कर रहा था। मैंने सीधे व्यूमोडेल के भीतर से एक दृश्य को तत्काल या संदर्भित नहीं किया। क्या यह अनुमति है? यदि नहीं, तो क्या एक और वर्ग बनाना और उसे एक सहायक के रूप में इंजेक्शन देना एक अच्छा काम होगा?
 – 
Cole Winfield
22 अगस्त 2021, 12:20

1 उत्तर

सबसे बढ़िया उत्तर

enter image description here

मूल रूप से एमवीवीएम पैटर्न इस तरह दिखता है। यह काफी सरल है, व्यू (फ्रैगमेंट, गतिविधि, कस्टम व्यू) को केवल व्यूमोडेल के साथ संवाद करना चाहिए, इसे किसी अन्य वर्ग को कॉल नहीं करना चाहिए। ViewModel आपके डेटा और विचारों के लिए एक बिचौलिए के रूप में कार्य करता है। तो डेटा को आपके डेटा स्रोत (जो आपके कोड को देखने से रूम डेटाबेस लगता है) से व्यूमोडेल और वहां से व्यू में पास किया जाना चाहिए। व्यूमोडेल से डेटा को विचारों में पास करने के लिए, किसी को लाइवडेटा / स्टेटफ्लो / का उपयोग करना चाहिए साझा प्रवाह। अब, यदि आप एमवीवीएम का सख्ती से पालन करना चाहते हैं तो व्यूमोडेल में डेटा सीधे डेटासोर्स से नहीं आना चाहिए। जैसा कि चित्र में दिखाया गया है, आपके डेटा स्रोत और व्यूमॉडल के बीच रिपोजिटरी नामक एक और परत होनी चाहिए। आपके कोड में, ViewModel में आपने सीधे (dao) के रूप में डेटा स्रोत को कॉल किया है, जो कि अनुमेय नहीं है। डेटा स्रोत और ViewModel के बीच डेटा प्रवाहित करने के लिए रिपॉजिटरी एक बिचौलिए के रूप में कार्य करता है। इस प्रकार एमवीवीएम काम करता है।

आपके सवालों के जवाब:

1. क्या यह उचित एमवीवीएम डिज़ाइन है: व्यूमोडेल -फ्रैगमेंट लॉजिक को अच्छी तरह से संभाला गया है लेकिन आपने सीधे अपने व्यू मॉडल में दाओ को बुलाया है जो दोषपूर्ण है। आपको एक रिपोजिटरी बनानी होगी, जहां आपको दाओ को कॉल करना होगा और उस रिपोजिटरी को व्यूमोडेल में पास करना होगा।

  1. व्यापार तर्क क्या है? उत्तर आंशिक रूप से परियोजना की जटिलता और डेवलपर के स्वाद का मामला होगा। लेकिन सुनिश्चित करें कि इसमें कोई व्यू संबंधित कोड नहीं है और इसे ViewModel के माध्यम से प्रवाहित होना चाहिए। व्यापार तर्क पुन: प्रयोज्य होना चाहिए और अन्य वर्गों से दूर रखा जाना चाहिए
1
Karunesh Palekar 22 अगस्त 2021, 09:34