如何用最短的方式创建自定义事件?



CustomWebViewClient具有覆盖功能onPageFinished。通知MainViewModel函数触发的最短方式是什么?我是说某个事件。

我想可以使用StateFlow,像这样:

class MainViewModel : ViewModel() { 
init {
val client = CustomWebViewClient()
viewModelScope.launch {
client.onPageFinished.collect {
// ...
}
}
}
}
class CustomWebViewClient() : WebViewClient() {
private val _onPageFinished = MutableStateFlow("")
val onPageFinished = _onPageFinished.asStateFlow()
override fun onPageFinished(view: WebView, url: String) {
_onPageFinished.update { "" }
}
}

但是在这种情况下需要转移不必要的空字符串,并且会在onPageFinished调用之前发生第一次调用,因为MutableStateFlow有值。所以出现需要添加一些枚举或类为了做到与when关键字过滤。

也许有更快捷的方法来做到这一点?

您可以将lambda参数添加到CustomWebViewClient构造函数中,该构造函数将在页面完成时被调用。

class MainViewModel : ViewModel() { 
init {
val client = CustomWebViewClient({handle the event})
}
}
class CustomWebViewClient(onPageFinished: () -> Unit) : WebViewClient() {
override fun onPageFinished(view: WebView, url: String) {
onPageFinished()
}
}

请注意,引用任何来自android。*包在ViewModel中通常是一个大禁忌。

如果您想使用MutablStateFlow方法,另一种选择是也覆盖onPageStarted,并做一些像

class CustomWebViewClient(): WebViewClient() {
private val _onPageFinished = MutableStateFlow(false)
val onPageFinished = _onPageFinished.asStateFlow()
override fun onPageStarted(
view: WebView?,
url: String?,
favicon: Bitmap?,
) {
_onPageFinished.update { false }
}
override fun onPageFinished(view: WebView?, url: String?) {
_onPageFinished.update { true }
}
}
class MainViewModel : ViewModel() {
init {
val client = CustomWebViewClient()
viewModelScope.launch {
client.onPageFinished.collect {
if (it) {
// Do stuff when page is loaded
} else {
// Do stuff when page starts loading
}
}
}
}
}

虽然最终使用流来实现这一点有点过分,但使用Mieszko Koźma建议的lambda方法可能更直接。

最新更新