如何在自定义设计系统中限制特定 Drawable 的使用?

You*_*oui 8 android kotlin android-jetpack-compose

我正在使用 Jetpack Compose 在 Android 中实现自定义设计系统,并且我想限制特定的使用drawables以保持一致性和设计完整性。具体来说,我想限制drawables仅使用 Microsoft 开发的Fluent 图标drawables,这些图标在 Android Studio 中共享。

在我的组件中,我定义了接受图标为 的属性drawables。但是,我想将这些属性限制为仅接受 Fluent 图标,并且不允许用户传递任何整数或任何其他可绘制对象。

如何在我的定制设计系统中实现此限制?我应该使用注释处理还是实现一个自定义类来检查Fluent 图标?或者有更好的方法来实现这一目标吗?

任何见解或指导将不胜感激。先感谢您!

gme*_*tax 1

我怀疑您的问题只有 1 个解决方案,我喜欢的一种方法是使用 LocalComposition。

带间距的示例


data class Spacing(
    val small: Dp = 8.dp,
    val medium: Dp = 16.dp,
    val large: Dp = 32.dp,
)

val LocalSpacing = compositionLocalOf { Spacing() }

val MaterialTheme.spacing: Spacing
    @Composable
    @ReadOnlyComposable
    get() = LocalSpacing.current


@Composable
fun MainApplicationTheme(
    content: @Composable () -> Unit
) {
    CompositionLocalProvider(
        LocalSpacing provides Spacing(),
    ) {

        MaterialTheme(
            colors = LightColorPalette,
            typography = Typography,
            shapes = Shapes,
            content = content
        )
    }
}


Run Code Online (Sandbox Code Playgroud)

然后你用 MainApplicationTheme 包裹MainActivity你的可组合项,并且你可以访问间距。

你也可以为 Fluent 图标做类似的事情drawables

你像这样使用上面的MaterialTheme.spacing.small

Update1 我所指的代码需要对上面的代码片段进行一些更改,如下所示


class Icons

@get:DrawableRes
public val Icons.AddCircle: Int
    get() {
        return R.drawable.add_circle
    }

val LocalIcons = compositionLocalOf { Icons() }

val MaterialTheme.icons: Icons
    @Composable
    @ReadOnlyComposable
    get() = LocalIcons.current

@Composable
fun MainApplicationTheme(
    content: @Composable () -> Unit
) {
    CompositionLocalProvider(
        LocalIcons provides Icons(),
    ) {

        MaterialTheme(
            colors = LightColorPalette,
            typography = Typography,
            shapes = Shapes,
            content = content
        )
    }
}


Run Code Online (Sandbox Code Playgroud)

并像这样使用它MaterialTheme.icons.AddCircle