Skip to content

Instantly share code, notes, and snippets.

@zach-klippenstein
Last active October 20, 2022 18:38
Show Gist options
  • Select an option

  • Save zach-klippenstein/ed184c7c7ad9b21cd9fd8c3a49e4a584 to your computer and use it in GitHub Desktop.

Select an option

Save zach-klippenstein/ed184c7c7ad9b21cd9fd8c3a49e4a584 to your computer and use it in GitHub Desktop.

Revisions

  1. zach-klippenstein revised this gist Oct 20, 2022. No changes.
  2. zach-klippenstein created this gist Oct 20, 2022.
    133 changes: 133 additions & 0 deletions CursedButtons.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,133 @@
    import androidx.compose.foundation.layout.Box
    import androidx.compose.foundation.layout.Column
    import androidx.compose.foundation.layout.wrapContentSize
    import androidx.compose.material.Button
    import androidx.compose.material.Text
    import androidx.compose.runtime.Composable
    import androidx.compose.runtime.LaunchedEffect
    import androidx.compose.runtime.getValue
    import androidx.compose.runtime.mutableStateOf
    import androidx.compose.runtime.remember
    import androidx.compose.runtime.setValue
    import androidx.compose.ui.Modifier

    @Composable
    fun CursedButtonDemo() {
    var counter by remember { mutableStateOf(0) }
    Column(modifier = Modifier.wrapContentSize()) {
    Text("Counter: $counter")
    CursedButton(
    onClick = {
    counter++
    {
    CursedButton(
    onClick = {
    counter++
    {
    Text("STOP CLICKING!!")
    }
    },
    ) {
    Text("Thanks for humoring me")
    }
    }
    }
    ) {
    Text("Click me!")
    }
    }
    }

    @Composable
    fun CursedButtonDemo2() {
    var counter by remember { mutableStateOf(0) }
    Column(modifier = Modifier.wrapContentSize()) {
    Text("Counter: $counter")
    CursedButton2(
    onClick = {
    LaunchedEffect(Unit) {
    counter++
    }
    CursedButton2(
    onClick = {
    LaunchedEffect(Unit) {
    counter++
    }
    Text("STOP CLICKING!!")
    },
    ) {
    Text("Thanks for humoring me")
    }
    }
    ) {
    Text("Click me!")
    }
    }
    }

    @Composable
    fun BlessedButtonDemo() {
    var counter by remember { mutableStateOf(0) }
    Column(modifier = Modifier.wrapContentSize()) {
    Text("Counter: $counter")
    when (counter) {
    0 -> Button(onClick = { counter++ }) {
    Text("Click me!")
    }

    1 -> Button(onClick = { counter++ }) {
    Text("Thanks for humoring me")
    }

    else -> Text("STOP CLICKING!!")
    }
    }
    }

    @Composable
    fun CursedButton(
    onClick: () -> @Composable () -> Unit,
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
    ) {
    val (actualContent, updateContent) = remember {
    mutableStateOf<(@Composable () -> Unit)?>(null)
    }

    if (actualContent != null) {
    Box(modifier = modifier, propagateMinConstraints = true) {
    actualContent()
    }
    } else {
    Button(
    onClick = { updateContent(onClick()) },
    modifier = modifier
    ) {
    content()
    }
    }
    }

    @Composable
    fun CursedButton2(
    onClick: @Composable () -> Unit,
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
    ) {
    val (actualContent, updateContent) = remember {
    mutableStateOf<(@Composable () -> Unit)?>(null)
    }

    if (actualContent != null) {
    Box(modifier = modifier, propagateMinConstraints = true) {
    actualContent()
    }
    } else {
    Button(
    onClick = { updateContent(onClick) },
    modifier = modifier
    ) {
    content()
    }
    }
    }