[英]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.current
和LocalContext.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.