بخشهای زیر نحوه بهروزرسانی GlanceAppWidget
و مدیریت وضعیت آن را شرح میدهند.
وضعیت GlanceAppWidget
مدیریت کنید
کلاس GlanceAppWidget
ارائه شده هر زمان که ویجت ایجاد می شود یا نیاز به به روز رسانی دارد، نمونه سازی می شود، بنابراین باید بدون حالت و غیرفعال باشد.
مفهوم دولت را می توان به موارد زیر تقسیم کرد:
- وضعیت برنامه : وضعیت یا محتوای برنامه که توسط ویجت مورد نیاز است. به عنوان مثال، لیستی از مقصدهای ذخیره شده (یعنی پایگاه داده) که توسط کاربر تعریف شده است.
- وضعیت نگاه : حالت خاصی که فقط مربوط به ویجت برنامه است و لزوماً وضعیت برنامه را تغییر نمی دهد یا بر آن تأثیر نمی گذارد. به عنوان مثال، یک چک باکس در ویجت انتخاب شده است یا یک شمارنده افزایش یافته است.
از وضعیت برنامه استفاده کنید
ویجت های برنامه باید غیرفعال باشند. هر برنامه مسئول مدیریت لایه داده و مدیریت وضعیتهایی مانند بیکاری، بارگیری و انعکاس خطا در رابط کاربری ویجت است.
به عنوان مثال، کد زیر مقصدها را از حافظه نهان حافظه از لایه مخزن بازیابی می کند، لیست ذخیره شده مقصدها را ارائه می دهد و بسته به وضعیت آن یک رابط کاربری متفاوت را نمایش می دهد:
class DestinationAppWidget : GlanceAppWidget() { // ... @Composable fun MyContent() { val repository = remember { DestinationsRepository.getInstance() } // Retrieve the cache data everytime the content is refreshed val destinations by repository.destinations.collectAsState(State.Loading) when (destinations) { is State.Loading -> { // show loading content } is State.Error -> { // show widget error content } is State.Completed -> { // show the list of destinations } } } }
هر زمان که وضعیت یا داده ها تغییر کند، این مسئولیت برنامه است که ویجت را مطلع و به روز کند. برای اطلاعات بیشتر به Update GlanceAppWidget مراجعه کنید.
GlanceAppWidget
به روز کنید
همانطور که در بخش مدیریت وضعیت GlanceAppWidget
توضیح داده شد، ویجت های برنامه در فرآیند متفاوتی میزبانی می شوند. Glance محتوا را به RemoteViews
واقعی ترجمه کرده و برای میزبان ارسال می کند. برای بهروزرسانی محتوا، Glance باید RemoteViews
را دوباره ایجاد کرده و دوباره ارسال کند.
برای ارسال بهروزرسانی، روش update
نمونه GlanceAppWidget
را با ارائه context
و glanceId
تماس بگیرید:
MyAppWidget().update(context, glanceId)
برای بدست آوردن glanceId
، از GlanceAppWidgetManager
پرس و جو کنید:
val manager = GlanceAppWidgetManager(context) val widget = GlanceSizeModeWidget() val glanceIds = manager.getGlanceIds(widget.javaClass) glanceIds.forEach { glanceId -> widget.update(context, glanceId) }
از طرف دیگر، از یکی از پسوندهای GlanceAppWidget update
استفاده کنید:
// Updates all placed instances of MyAppWidget MyAppWidget().updateAll(context) // Iterate over all placed instances of MyAppWidget and update if the state of // the instance matches the given predicate MyAppWidget().updateIf<State>(context) { state -> state == State.Completed }
این روش ها را می توان از هر بخشی از برنامه شما فراخوانی کرد. از آنجا که آنها توابع suspend
هستند، توصیه می کنیم آنها را خارج از محدوده رشته اصلی راه اندازی کنید. در مثال زیر، آنها در یک CoroutineWorker
راه اندازی شده اند:
class DataSyncWorker( val context: Context, val params: WorkerParameters, ) : CoroutineWorker(context, params) { override suspend fun doWork(): Result { // Fetch data or do some work and then update all instance of your widget MyAppWidget().updateAll(context) return Result.success() } }
برای جزئیات بیشتر در مورد کوروتین ها به Kotlin Coroutines در اندروید مراجعه کنید.