توضّح الأقسام التالية كيفية تعديل 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 } } } }
تقع على عاتق التطبيق مسؤولية الإبلاغ عن أي تغيير في الولاية أو البيانات. وقم بتحديث التطبيق المصغّر. اطّلِع على مقالة تحديث GlanceAppWidget للحصول على مزيد من المعلومات.
تعديل درجات الحرارة في "GlanceAppWidget
"
كما هو موضح في قسم إدارة حالة GlanceAppWidget
،
تتم استضافة الأدوات في عملية مختلفة. تعمل ميزة "نظرة سريعة" على ترجمة المحتوى إلى
RemoteViews
الفعلية ويرسلها إلى المضيف. لتعديل المحتوى، استخدِم ميزة "نظرة سريعة".
إعادة إنشاء 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 على Android للحصول على مزيد من التفاصيل حول الكوروتينات.