简体   繁体   English

如何将事件传递给 Composables?

[英]How to pass events to Composables?

I have two composables like this:我有两个像这样的组合物:

@Composable
fun Composable1(viewModel: MyViewModel) {
    LaunchedEffect(Unit) {
        viewModel.eventsFlow.collect { event ->
            if(event is ShowSnackbar) {
                // Send this event to Composable2 to show snackbar
            }
        }
    }
    Composable2(...) // passing some data and lambdas
}

@Composable
fun Composable2(...) {
    val scaffoldState = rememberScaffoldState()

    // On receiving event, show a snackbar

    Scaffold(scaffoldState) {
        // Other stuff
    }
}

(If another ShowSnackbar event comes while one snackbar is visible, I want to ignore that new event) (如果另一个 ShowSnackbar 事件发生而一个小吃店可见,我想忽略该新事件)

How to send such an event from one composable to another?如何将这样的事件从一个可组合发送到另一个?

I created a small example.我创建了一个小例子。 I hope It is help you.我希望它对你有帮助。 In my case I generate a "event" by means of clicking a button就我而言,我通过单击按钮生成“事件”

class ComposeActivity5 : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposeTutorialTheme {
                Composable1()
            }
        }
    }
}

@Composable
fun Composable1() {
    val scaffoldState = rememberScaffoldState()
    var showHide by remember { mutableStateOf(false) }
    var pressCount by remember { mutableStateOf(0) }

    Scaffold(
        scaffoldState = scaffoldState,
        content = { innerPadding ->
            Column(
                horizontalAlignment = Alignment.CenterHorizontally,
                modifier = Modifier
                    .padding(innerPadding)
                    .fillMaxSize()
            ) {
                Button(onClick = {
                    pressCount++
                    showHide = true

                }) {
                    Text(text = "Test")
                }
                Composable2(scaffoldState, showHide, pressCount) {
                    showHide = false
                }
            }
        }
    )
}

@Composable
fun Composable2(
    scaffoldState: ScaffoldState,
    showHide: Boolean,
    pressCount: Int,
    onDismiss: () -> Unit
) {
    val mostRecentOnDismiss by rememberUpdatedState(onDismiss)
    LaunchedEffect(scaffoldState, showHide) {
        if (showHide) {
            scaffoldState.snackbarHostState.showSnackbar(
                message = "We are ignore press button to show Snackbar. Total number of clicks $pressCount",
                actionLabel = "Close",
                duration = SnackbarDuration.Short,
            )
            mostRecentOnDismiss()
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM