مدیریت و به روز رسانی GlanceAppWidget

بخش‌های زیر نحوه به‌روزرسانی 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 در اندروید مراجعه کنید.