انتقال داده‌ها بین صفحات در Jetpack Compose

Jetpack Compose یک سیستم navigation قدرتمند برای ساخت تجربیات کاربری بصری (UI) در برنامه‌های اندرویدی شما فراهم می‌کند.

هنگام جابجایی بین صفحات، ممکن است نیاز داشته باشید که داده‌های را از یک صفحه لیست به یک صفحه جزئیات به اشتراک بگذارید. در این پست ما دو روش خوب برای دستیابی به این هدف را بررسی می‌کنیم و همچنین مزایا و معایب هر کدام را شرح می‌دهیم تا شما بتوانید راه حل مدنظر خود را انتخاب کنید.


چالش‌های مربوط به آرگومان‌های Jetpack Compose Navigation:

در حالی که Jetpack Compose navigation روشی راحت برای جابجایی بین صفحات ارائه می‌دهد، در حال حاضر محدودیت‌هایی در هنگام ارسال اشیاء داده‌ای پیچیده به عنوان آرگومان دارد. در زیر به برخی از نکات کلیدی اشاره شده است:

محدودیت‌های آرگومان‌های Jetpack Compose Navigation:

  • آرگومان‌های Jetpack Compose navigation در حال حاضر به انواع داده‌های اولیه و اشیاء Parcelable محدود هستند. این به این معناست که نمی‌توانید اشیاء پیچیده یا کلاس‌های داده سفارشی را به طور مستقیم به عنوان آرگومان ارسال کنید. (داده های اولیه مانند int, string و ...) (اشیاء Parcelable: مثل Bundle)
  • آرگومان‌های navigation برای قطعات کوچک داده که نیاز به جابجایی بین صفحات دارند، طراحی شده‌اند. برای مجموعه داده‌های بزرگتر یا اشیاء پیچیده، توصیه می‌شود از Shared ViewModel یا راه‌حل‌های مدیریت وضعیت دیگر استفاده کنید.

روش‌های انتقال داده بین صفحات:

1. روش اول : انتقال داده به صورت رشته JSON (راه‌حل موقت)

یک راه‌حل موقت رایج برای این محدودیت، تبدیل شیء داده‌ای شما (مثلاً مدل TV show) به یک رشته JSON با استفاده از کتابخانه‌هایی مانند GSON یا Moshi است. در اینجا یک تقسیم‌بندی از مراحل آورده شده است:

1. ایجاد مدل داده: یک کلاس داده تعریف کنید که نمایانگر شیء TVShow شما باشد. این کلاس شامل ویژگی‌هایی مانند عنوان، توضیحات و امتیازات خواهد بود.

2. Serializing به JSON: در صفحه لیست، هنگامی که کاربر بر روی یک آیتم TVShow کلیک می‌کند، TVShow مربوطه را به JSON تبدیل کنید.

3. navigation با آرگومان: از کتابخانه navigation استفاده کنید تا به صفحه جزئیات بروید. رشته JSON که Serializing کرده‌اید را به عنوان یک آرگومان به صفحه جزئیات ارسال کنید.

4. Deserializing در صفحه جزئیات: در تابع composable صفحه جزئیات، به آرگومان‌های دریافتی دسترسی پیدا کرده و رشته JSON را دوباره به شیء اصلی TV show را Deserializing کنید.

5. استفاده از شیء: اکنون شما شیء TVShow را در صفحه جزئیات دارید. از ویژگی‌های آن برای پر کردن عناصر رابط کاربری و نمایش جزئیات نمایش می توانید استفاده کنید.

همه کد ها کنار هم:

مزایا:

  • پیاده‌سازی ساده، به‌ویژه برای پروژه‌هایی با وابستگی‌های کم.
  • مناسب برای سناریوهایی که پیچیدگی شیء پایین است.

معایب:

  • موجب سربار تبدیل داده‌های غیرضروری می‌شود که می‌تواند بر عملکرد هنگام انتقال مکرر داده‌ها یا اشیاء پیچیده تأثیر بگذارد.
  • از مزایای سیستم composable در Jetpack Compose برای مدیریت داده‌ها بهره نمی‌برد.


2. روش دوم : استفاده از Shared ViewModel (توصیه‌شده)

این روش جداسازی بهتری از وابستگی ها را ترویج می‌دهد و از تبدیل غیرضروری داده‌ها جلوگیری می‌کند. در اینجا نحوه کار آن آمده است:

1. ایجاد Shared ViewModel: یک کلاس ViewModel تعریف کنید که شیء داده‌ای شما (مدل TV show) را نگه دارد و متدهایی برای دسترسی و به‌روزرسانی آن ارائه دهد.

2. دسترسی به ViewModel در هر دو صفحه: در صفحات لیست TVShows و جزئیات، به یک نمونه از Shared ViewModel دسترسی پیدا کنید.

3. انتقال داده: در صفحه لیست TVShows، شیء داده‌ای Shared ViewModel را با اطلاعات TV show انتخاب شده به‌روز کنید.

4. مشاهده (Observing) داده‌ها: در صفحه جزئیات TVShows، از composable ViewModel برای دسترسی به همان نمونه ViewModel استفاده کنید. ویژگی selectedTvShow را Observe کنید.

مزایا:

  • جداسازی رابط کاربری و منطق داده(data logic).
  • بهبود مدیریت جریان داده‌ها در برنامه شما.
  • جلوگیری از تبدیل داده‌های تکراری، بهبود عملکرد برای اشیاء پیچیده یا به‌روزرسانی‌های مکرر.

معایب:

  • نیاز به تنظیمات اضافی با ViewModelها در مقایسه با روش رشته JSON دارد.


کدام روش مناسب است؟

  • از روش رشته JSON برای سناریوهای ساده‌تر که پیچیدگی اشیاء پایین است و سربار تبدیل داده‌ها نگرانی بزرگی نیست، استفاده کنید. این روش ممکن است برای نمونه‌سازی‌ها یا پیاده‌سازی‌های سریع مناسب باشد.
  • برای اشیاء داده‌ای پیچیده یا سناریوهایی با به‌روزرسانی‌های مکرر داده، روش Shared ViewModel را در نظر بگیرید تا جداسازی تمیزتری از وابستگی ها حفظ شود و از تبدیل داده‌های تکراری جلوگیری شود.

نتیجه‌گیری :

با درک این روش‌ها، می‌توانید به طور مؤثری اشیاء را بین صفحات در برنامه‌های Jetpack Compose خود انتقال دهید و تجربه کاربری کلی و جریان داده‌ها در برنامه خود را بهبود بخشید. روشی را انتخاب کنید که با پیچیدگی و نیازهای عملکردی پروژه شما بهترین تطابق را دارد.


ممنون که تا آخر این پست همراه من بودید ، امیدوارم براتون مفید بوده باشه 🙌🙏✌ (:

بقیه آموزش های من با نام (mister developer) را می توانید در تلگرام و اینستاگرام دنبال کنید!!

کانال تلگرام: mister_developerr

اینستاگرام: mister_developerr

موفق و پیروز باشید