ส่วนต่อไปนี้อธิบายวิธีอัปเดต GlanceAppWidget
และจัดการ
จัดการสถานะGlanceAppWidget
คลาส GlanceAppWidget
ที่ระบุจะมีการสร้างอินสแตนซ์เมื่อใดก็ตามที่วิดเจ็ต
ที่สร้างขึ้นหรือต้องมีการอัปเดต ดังนั้นจึงควรไม่เก็บสถานะและแพสซีฟ
แนวคิดของรัฐแบ่งออกได้เป็นข้อมูลต่อไปนี้
- สถานะของแอปพลิเคชัน: สถานะหรือเนื้อหาของแอปที่ผู้ดูแลระบบกำหนดไว้ วิดเจ็ต เช่น รายการปลายทางที่จัดเก็บไว้ (ซึ่งก็คือฐานข้อมูล) ที่กำหนดโดย ผู้ใช้รายนั้น
- สถานะข้อมูลโดยย่อ: สถานะเฉพาะที่เกี่ยวข้องกับวิดเจ็ตแอปเท่านั้น และไม่จำเป็นต้องแก้ไขหรือส่งผลต่อสถานะของแอป ตัวอย่างเช่น มีการเลือกช่องทำเครื่องหมายในวิดเจ็ตหรือตัวนับเพิ่มขึ้น
ใช้สถานะของแอปพลิเคชัน
วิดเจ็ตแอปควรเป็นแบบแพสซีฟ แต่ละแอปพลิเคชันมีหน้าที่จัดการ ชั้นข้อมูลและการจัดการสถานะ เช่น ไม่มีการใช้งาน การโหลด และข้อผิดพลาดในการแสดง ใน UI ของวิดเจ็ต
ตัวอย่างเช่น โค้ดต่อไปนี้ใช้เรียกข้อมูลปลายทางจากในหน่วยความจำ แคชจากเลเยอร์ที่เก็บ แสดงรายการปลายทางที่จัดเก็บไว้ และ แสดง UI ที่แตกต่างกันตามสถานะ ดังนี้
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
จริงและส่งไปยังโฮสต์ หากต้องการอัปเดตเนื้อหา ข้อมูลโดยย่อ
ต้องสร้าง 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 ใน Android