Webview 不会在 mutableIntState 更改时重新组合

问题描述 投票:0回答:1

我的文章详细信息页面的设计如下:上面的部分是原生的,而文章的其余部分(图像、嵌入、推文...)作为 HTML 内容接收。 我想实现字体调整大小功能,为此我使用了

mutableIntState
,这会导致每当滑块具有新值时标题和摘要就会被 重新组合。 不幸的是,它不影响网页视图!尽管我创建了一个自定义 Webview 可组合项,它采用以下参数:

  1. 字体大小
  2. html:表示 HTML 片段的字符串值,稍后我用 CSS 包裹它以指定字体大小。

视图模型:

class PageViewModel: ViewModel(){
    //get initial value from sharedPreferences
    var fontSize by mutableIntStateOf(Utility.getFontSize())
        private set

    fun updateFontSize(newValue:Int){
        fontSize = newValue
        //store new value in shared preferences
        Utility.saveFontSize(newValue)
    }
}

我的屏幕:

    @Composable
    fun MyScreen(title: String, summary: String, html: String){
        val myViewModel: PageViewModel = viewModel()
    Column{
    ....
        //the slider enables the user to select a value ranging between 16f & 26f
        Slider(onValueChange = {myViewModel.updateFontSize(it.toInt())},
             steps = 3, valueRange= 16f .. 26f, value = myViewModel.fontSize.toFloat())
        
    ...
        Text(text = title, fontSize = (myViewModel.fontSize + 6).dp)
        Text(text = summary, fontSize = myViewModel.fontSize.dp)
        MyCustomWebView(html = html, fontSize = fontSize) 
    }
 }

我的自定义Webview如下:

@Composable
fun MyCustomWebView(html:String, fontSize: Int){
    val context = LocalContext.current
    //assuming that html is an html snippet
    val htmlStyled = "<html><head><style>body,p,h1,h2,h3,span,a{font-size: ${fontSize}px!important;}</style></head><body>${html}</body></html>"
    AndroidView(modifier = Modifier.fillMaxWidth(),
         factory = {
                WebView(context).apply{
                      webViewClient = WebViewClient()
                      settings.cacheMode = WebSettings.LOAD_NO_CACHE
                      settings.setRenderPriority(WebSettings.RenderPriority.HIGH)
                      settings.javaScriptEnabled = true
                      settings.domStorageEnabled = true
                      settings.allowFileAccess = true
                      
                      //I even tried using the depricated textSize
                      //It doesn't update live
                      /*settings.textSize = when (fontSize) {
                        16 -> WebSettings.TextSize.SMALLEST
                        18 -> WebSettings.TextSize.SMALLER
                        21 -> WebSettings.TextSize.NORMAL
                        23 -> WebSettings.TextSize.LARGER
                        else -> WebSettings.TextSize.LARGEST
                    }*/
                     
                     loadDataWithBaseURL("", htmlStyled, "text/html", "UTF-8","")
                }
         }
}

非常感谢任何帮助。 谢谢。

kotlin android-jetpack-compose android-webview font-size
1个回答
0
投票

在AndroidView中必须使用

update
值参数..所以customWebView变成如下:

@Composable
fun MyCustomWebView(html:String, fontSize: Int){
.......
    AndroidView(modifier = Modifier.fillMaxWidth(),
         factory = {...},
         update = { it.settings.textZoom =   fontSize * 6
         })
  }
© www.soinside.com 2019 - 2024. All rights reserved.