I want to implement a dynamic html page parsing function. The implementation is as follows:
First, I load the page into the WebView, then I parse it. I ran into a problem that when I try to call a @Composable function inside a non-@Composable function, an error occurs. In this case, I’m trying to call the “loadAndParseWebPageComposable” function. How can I get around this error? The module code is shown below.
@Composable
fun AddProductScreen(viewModel: ProductViewModel, onAddComplete: () -> Unit) {
var url by remember { mutableStateOf("") }
var loading by remember { mutableStateOf(false) }
Column(modifier = Modifier.padding(16.dp)) {
TextField(
value = url,
onValueChange = { url = it },
label = { Text("Введите URL товара") },
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = {
loading = true
}) {
Text("Добавить")
}
if (loading) {
CircularProgressIndicator()
}
if (loading) {
LaunchedEffect(url) {
loadAndParseWebPageComposable(url, viewModel) {
loading = false
onAddComplete()
}
}
}
}
}
@Composable
fun loadAndParseWebPageComposable(url: String, viewModel: ProductViewModel, onLoaded: () -> Unit) {
val context = LocalContext.current
AndroidView(factory = {
WebView(context).apply {
settings.javaScriptEnabled = true
webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
super.onPageFinished(view, url)
view.evaluateJavascript(
"(function() { return document.documentElement.outerHTML })();"
) { html ->
viewModel.parseProductHtml(html ?: "")
onLoaded()
}
}
}
loadUrl(url)
}
}, update = { webView ->
webView.loadUrl(url)
})
}
I tried to search the Internet for similar situations, but I didn’t find anything concrete, and removing the @Composable annotation from the “loadAndParseWebPageComposable” function won’t work, since there is an AndroidView inside