【问题标题】:How to pass events to Composables?如何将事件传递给 Composables?
【发布时间】:2021-11-09 11:55:56
【问题描述】:

我有两个这样的组合:

@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
    }
}

(如果另一个 ShowSnackbar 事件在一个小吃店可见时出现,我想忽略该新事件)

如何将这样的事件从一个可组合发送到另一个?

【问题讨论】:

    标签: android kotlin android-jetpack-compose android-jetpack-compose-scaffold


    【解决方案1】:

    我创建了一个小例子。我希望它对你有帮助。就我而言,我通过单击按钮生成“事件”

    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()
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2020-09-19
      相关资源
      最近更新 更多