[英]How to get the rootView inside composable function?
在我的活動中,我有一個可組合的 function:
@Composable
private fun checkResponse() {
when(val response = viewModel.response) {
is Success -> //...
is Failure -> showSnackBar() //Here is the problem.
}
}
showSnackBar()
是這樣的:
private fun showSnackBar(rootView: View) {
Snackbar.make(rootView, "Error", Snackbar.LENGTH_LONG).show()
}
它將rootView
作為參數。 如何調用 showSnackBar 並傳遞正確的參數?
您可以使用 LocalView.current 獲取根視圖,但如果用於顯示SnackBar
則不需要它。
如果您正在使用 Scaffold,則可以顯示 SnackBar
val scaffoldState: ScaffoldState = rememberScaffoldState()
和
androidx.compose.material.Scaffold(
scaffoldState = scaffoldState,
content = {
Column(Modifier.padding(it)) {
Button(onClick = {
coroutineScope.launch {
scaffoldState.snackbarHostState.showSnackbar("Hello World")
}
}) {
Text("Show Snackbar")
}
}
}
)
如果您不想等待持續時間結束,可以使用 LaunchedEffect 取消
LaunchedEffect(scaffoldState.snackbarHostState) {
// Show snackbar using a coroutine, when the coroutine is cancelled the
// snackbar will automatically dismiss. This coroutine will cancel whenever
// if statement is false, and only start when statement is true
// (due to the above if-check), or if `scaffoldState.snackbarHostState` changes.
scaffoldState.snackbarHostState.showSnackbar("LaunchedEffect snackbar")
}
如果您沒有 Scaffold,您可以使用 SnackBar 可組合作為
Box(modifier = Modifier.fillMaxSize()) {
var showSnackbar by remember {
mutableStateOf(false)
}
LaunchedEffect(key1 = showSnackbar) {
if (showSnackbar) {
delay(2000)
showSnackbar = false
}
}
Column {
Button(onClick = {
showSnackbar = !showSnackbar
}) {
Text("Show Snackbar")
}
}
if (showSnackbar) {
androidx.compose.material.Snackbar(modifier = Modifier.align(Alignment.BottomStart),
action = {
Text(text = "Action",
color = Color(0xffCE93D8),
modifier = Modifier.clickable {
showSnackbar = false
}
)
}) {
androidx.compose.material.Text("Message")
}
}
}
LaunchedEffect 是將其從合成中移除。 如果您願意,可以使用幻燈片 animation。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.