簡體   English   中英

如何在 Jetpack Compose 中設置自定義上下文?

[英]How to set a custom Context in Jetpack Compose?

我遇到了 Jetpack Compose 的問題。 在我的應用程序的舊類(活動和片段)中,我為我的自定義Resources包裝器使用了自定義Context包裝器。 這是因為字符串資源值是從服務器下載的; Strings 資源文件確實包含字符串 ID,它們的值為空並由服務器的值替換。

在活動和片段中,我可以簡單地替換getContext()attachBaseContext(newBase: Context?)方法中的attachBaseContext(newBase: Context?) ,但如何在 Jetpack Compose 中執行此操作?

Jetpack Compose 確實有這些Context方法: LocalConfiguration.currentLocalContext.current 我喜歡這是多么簡單,但我無法找到這個 Context 對象的初始化位置。 一開始我以為是在attachBaseContext()方法中的父Activity設置內容的時候,但是這段代碼好像沒什么用:

@AndroidEntryPoint
class MyComposeActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContent {
        ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
            MyComposeActivityScreen()
        }
    }
}

override fun attachBaseContext(newBase: Context?) {
    val language = Locale(Utils.getLanguage(newBase))
    super.attachBaseContext(MyCustomContextWrapper.wrap(MyCustomResourcesContextWrapper(newBase), language))
}

您可以嘗試使用CompositionLocalProvider手動指定上下文:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    updateComposeView(this)
}

override fun attachBaseContext(newBase: Context?) {
    super.attachBaseContext(newBase)
    updateComposeView(newBase ?: this)
}

fun updateComposeView(context: Context) {
    setContent {
        CompositionLocalProvider(
            LocalContext provides context
        ) {
            ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
                MyComposeActivityScreen()
            }
        }
    }
}

解決原始問題的另一種更 Compose 方法是創建您自己的字符串持有者,例如LocalStrings ,如本答案所示。

暫無
暫無

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

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