簡體   English   中英

如何在 Android 中讀取 Flow 的結果 Compose @Composable function 用於非 GUI 消費(例如,用於寫入存儲庫)

[英]How to read the result of Flow in Android Compose @Composable function for non-GUI consumption (e.g. for writing in repository)

我在我的 Android Compose 應用程序中引入了 DataStore,用於存儲用戶首選項。 雖然我對將 DataStore 實例保留為 Context 實例的屬性不滿意——因為只能從 @Composable 訪問 Context(而不是在例如存儲庫中)——但我仍然堅持下去。

讓我們假設(按照參考教程), getEmail是讀取 DataStore 鍵值對並返回 Flow 實例的 function。

我的意圖是將以下(近似)代碼放入我的頂級@Composable 之一,該@Composable 以AppContainer 作為參數-此類可組合物是非常頂級的:

var email = getEmail.collectAsState("") //or should I use single()?
appContainer.salesOrderRespository.setEmail(email)

但是我害怕以我上面寫過的這種非常粗暴的方式來做這件事。 例如,我擔心以下事情:

  1. 我應該把這段代碼放在一些 scope 中(因為它的 collectAsState 可以阻塞 GUI 線程),比如:

    val scope = rememberCoroutineScope() scope.launch { var email = getEmail.collectAsState("") //或者我應該使用單個(?) appContainer.salesOrderRespository.setEmail(email)
    }

  2. 我可以使用構造var email = getEmail.collectAsState("") - email 不能立即訪問,它是異步分配的。 這就是為什么我可能需要這樣的東西(只是想象):

    getEmail.collectAsState("").onReadingDone(it -> { appContainer.salesOrderRespository.setEmail(it) })

  3. 而且,當然,我渴望盡早執行此代碼。 幾乎我的存儲庫都需要配置數據,如果應用程序正在啟動並繼續運行,同時仍從 DataStore 讀取配置數據,那么應用程序將無法按預期工作。

所以 - 我試圖只做一件事 - 讀取 DataStore( 1.作為 Context 的屬性,因為沒有其他適當的全局實例可以創建這樣的屬性; 2.在 @Composable 內部,因為 Context 可以從@Composable)並將讀取的值分配給一個或多個存儲庫的屬性。 但我觀察到這個操作非常復雜,涉及很多問題。 我列出了它們。 那是我的問題很長很復雜,但它有效地試圖解決一件簡單的事情——閱讀+分配。

您不必使用上下文幫助器。 相反,我會考慮集成 Hilt 並將您的數據存儲注入您的存儲庫。

這是有關該技術的博客。 https://medium.com/androiddevelopers/datastore-and-dependency-injection-ea32b95704e3

暫無
暫無

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

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