在android jetpack compose中,状态更改时触发事件

在android jetpack compose中,状态更改时触发事件,android,kotlin,android-webview,android-jetpack-compose,Android,Kotlin,Android Webview,Android Jetpack Compose,我有一个网络视图和一个文本字段。我想在textField触发onGo操作或其值更改时触发web视图重新加载 下面是可变字符串: var urlValue: MutableState<String> = mutableStateOf(DefaultUrl) 下面是web view的代码: AndroidView({ context -> WebView(context).apply { if(urlValue.value.isNotEmpty()) {

我有一个网络视图和一个文本字段。我想在textField触发onGo操作或其值更改时触发web视图重新加载

下面是可变字符串:

var urlValue: MutableState<String> = mutableStateOf(DefaultUrl)
下面是web view的代码:

AndroidView({ context ->
    WebView(context).apply {
        if(urlValue.value.isNotEmpty()) {
            Log.i("TAG", "MainComposable: ${urlValue.value}")
            loadUrl(urlValue.value)
        }

        webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(
                view: WebView,
                url: String
            ): Boolean {
                view.loadUrl(url)
                return false
            }
        }
    }
}

但是web视图不会重新加载新的URL。如何在go action触发器上加载新的URL?

您可以使用
update
属性。
比如:

    AndroidView(
        factory = {
            WebView(it).apply {
                this.webViewClient  =  WebViewClient()
                this.loadUrl("defaultUrl")
            }
        },
        update = {
            it.loadUrl(urlValue)
        },
    )

检查以下代码以在WebView中渲染:

@SuppressLint("SetJavaScriptEnabled")
@Composable
fun WebPageScreen(urlToRender: String) {
    AndroidView(factory = {
        WebView(it).apply {
            webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(
                    view: WebView?,
                    request: WebResourceRequest?
                ): Boolean {
                    return false
                }
            }
        }
    }, update = {
        it.loadUrl(urlToRender)
    })
}
AndroidView()
composable函数的
update
块在布局膨胀后被调用

@SuppressLint("SetJavaScriptEnabled")
@Composable
fun WebPageScreen(urlToRender: String) {
    AndroidView(factory = {
        WebView(it).apply {
            webViewClient = object : WebViewClient() {
                override fun shouldOverrideUrlLoading(
                    view: WebView?,
                    request: WebResourceRequest?
                ): Boolean {
                    return false
                }
            }
        }
    }, update = {
        it.loadUrl(urlToRender)
    })
}