ITmob-Ly
发布于 2023-06-13 / 135 阅读
0

如何检查Composable(可组合项)是否是正在预览中呈现/渲染?(LocalInspectionMode 的用法)

有时可能想检查 Composable 是否正在 @Preview 中渲染/呈现,来判断是显示真实数据还是模拟数据。例如,可以在预览窗口中显示占位符图像而不是显示真实数据。

LocalInspectionMode 是提供是否是可检查模式的 CompositionLocal。如果组合是在 Inspectable 组件内组成的,则为 true。我们可以检查 LocalInspectionMode.current,如果 Composable 是在预览模式下渲染,它将返回 true。

@Composable
fun GreetingScreen(name: String) {
    if (LocalInspectionMode.current) {
        // Show this text in a preview window:
        Text("Hello preview user!")
    } else {
        // Show this text in the app:
        Text("Hello $name!")
    }
}

上例是官方文档中的示例,根据是否是预览来显示不同的文字。

真实开发中文字等信息是可以通过提供测试数据来供预览模式渲染,用它来在预览窗口显示占位符图像使用的更多,因为预览模式是有限制的,不能加载网络和本地文件,真实的网络图片是不能在预览模式加载的。

@Composable
private fun InspectionModeSample() {
    Box(Modifier.size(64.dp)) {
        if (LocalInspectionMode.current) {
            Image(
                modifier = Modifier.fillMaxSize(),
                imageVector = Icons.Filled.Image,
                contentDescription = "Place Holder",
                contentScale = ContentScale.Fit,
            )
        } else {
            AsyncImage(
                modifier = Modifier.fillMaxSize(),
                model = "https://unsplash.com/photos/X7O0-lgHQMo?w=640",
                contentDescription = "Image from Internet",
            )
        }
    }
}

How to use LocalInspectionMode

AsyncImage 是可以设置 placeholder 参数的,它是可以在预览模式渲染的,但是不是所有的地方的需要设置 placeholder 的,根据项目需要判断是否需要使用 LocalInspectionMode