在安卓喷气背包中预览"screen" 使用预览参数导航控制器撰写导航



我发现了android Cetpack Compose(和Navigation(,并尝试显示以navController为参数的视图预览。

为了实现这一点,我使用了PreviewParameter,我没有错误,但在预览窗口中没有显示任何内容。

有人知道如何将伪造的NavController实例传递给Composable吗?

class FakeNavController : PreviewParameterProvider<NavController> {
override val values: Sequence<NavController>
get() {}
}
@Preview
@Composable
fun Preview(
@PreviewParameter(FakeNavController::class) fakeNavController: NavController
) {
HomeView(fakeNavController)
}

您不必使其为null并将null传递给它。你只需要通过这个:rememberNavController()

@Preview
@Composable
fun Preview() {
HomeView(rememberNavController())
}

PreviewParameter用于创建具有不同数据的同一视图的多个预览。您需要从values返回所需的值。在您的示例中,您没有返回任何内容,这就是它不起作用的原因(在我的示例中甚至没有构建(。

这不会帮助您模拟导航控制器,因为您仍然需要以某种方式创建它才能从values返回。我认为这是不可能的。

相反,您可以传递一个处理程序,在这种情况下,您不需要模拟它:

@Composable
fun HomeView(openOtherScreen: () -> Unit) {

}
// your Navigation view
composable(Destinations.Home) { from ->
HomeView(
openOtherScreen = {
navController.navigate(Destinations.Other)
},
)
}

最后,我声明了一个可以为null的NavController,它就可以工作了。

@Composable
fun HomeView(navController: NavController?) {
Surface {
Column(
modifier = Modifier
.padding(all = 4.dp)
) {
Text(
text = "Home View",
style = MaterialTheme.typography.body2
)
Spacer(modifier = Modifier.height(8.dp))
Button(onClick = { navController?.navigate("lineRoute") }) {
Text(text = "nav to Line view")
}
}
}
}

@Preview
@Composable
fun Preview (){
HomeView(null)
}

最新更新