Vadim Kapustin
11/20/2020, 8:33 AMabstract class DialogComponent(
componentContext: ComponentContext,
name: String,
) : Component(componentContext, name) {
private val _opened = mutableStateOf(false)
protected val _title = mutableStateOf(name)
fun open() { _opened.value = true }
fun close() { _opened.value = false }
@Composable
override fun render() {
if (!_opened.value) return
super.render()
Dialog(_title.value, onDismissEvent = ::close
) {
content()
}
}
@Composable
abstract fun content()
}
Now I can create a derived components with the implementation of content:
class LoginDialog(
componentContext: ComponentContext,
private val onLogged: (Operator) -> Unit
) : DialogComponent(componentContext, "Login") {
val password = remember { mutableStateOf("") }
// ...
@Composable
override fun content() {
// ...
Button(
onClick = {
if (controller.authorize(operator, password.value))
onLogged(operator)
password.value = ""
close()
}
}
) {
Text("Login")
}
}
}
Then I can call window rendering in the root component:
//...
private val dialog = LoginDialog(componentContext,onAuthorize)
@Composable
override fun render() {
// ...
Button(onClick = dialog::open) { Text("Login") }
dialog.render()
// ...
}
So, what do you think about this approach?jim
11/20/2020, 10:14 AMVadim Kapustin
11/20/2020, 11:04 AMArkadii Ivanov
11/20/2020, 11:14 AMArkadii Ivanov
11/20/2020, 11:16 AM