簡體   English   中英

如何在非掛起狀態下從 DataStore 返回值 function

[英]How to return value from DataStore in non-suspend function

我在共享首選項中保存應用程序語言,並通過覆蓋活動中的attachBaseContext()來設置應用程序語言,如下所示:

    override fun attachBaseContext(base: Context) {
    
       val language: String = sharedPreferences.language

       super.attachBaseContext(wrapContext(base, language))
    }

其中wrapContext()是 function 根據其參數值更改語言。

遷移到 DataStore 后,我無法返回attachBaseContext()中的語言,因為它沒有掛起 function,並且語言成為一個流(應該在掛起函數內收集)

我怎么解決這個問題?

DataStore 是異步的 API 用於寫入和讀取少量數據。 要同步讀取數據,您需要使用runBlocking協程構建器。 這將阻塞調用線程,直到 DataStore 返回可能導致ANR

val syncData = runBlocking { context.dataStore.data.first() } // or { context.dataStore.data.firstOrNull() }

這是一個很好的機會,可以考慮如何在不使用runBlocking的情況下異步使用 DataStore,或許可以進行一些重構。

如果您決定使用runBlocking ,您需要考慮合理的超時時間,以免永遠凍結 UI:

val syncData = runBlocking { 
    withTimeoutOrNull(2000) { // UI can freeze for 2 seconds
        context.dataStore.data.first()
    }
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM