簡體   English   中英

如何在可組合 function 中獲取 rootView?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM