Search code examples
androidkotlinandroid-jetpack-composekotlin-android-extensionsandroid-vectordrawable

Jetpack Compose: Custom VectorAsset Icon object similar to built-in `Icons.Default`


It looks like the only way to go about loading custom icons from Android Vector Resources in the res folder is to do it within a @Composable function using the vectorResource(R.drawable.myVectorName) method.

This is great and all, but I like the syntax of fetching VectorAssets for the Icon(asset: VectorAsset) class, which looks like Icon(Icons.Default.Plus).

It looks like the vectorResource() method uses an internal method called loadVectorResource(), and the methods it uses to read the actual XML file composing the vector asset file are also internal.

How would I go about creating an object like MyAppIcons.Default.SomeIcon in Jetpack Compose?

EDIT

So, I have sort-of found a solution. However, it would be nice to make my own extension/overloading of the built-in Icon() function, but I'm not sure if there is a proper way to do this.


Solution

  • Turns out I wasn't using my brain. The answer is pretty easy.

    The gist is, Icon() is a composable function, meaning that of course vectorResource() can be used there.

    So, the correct approach is no secret... it's to make your own MyAppIcon() component, call vectorResource() and then return a normal Icon(), like so:

    Correct Way

    @Composable
    fun MyAppIcon(
        resourceId: Int,
        modifier: Modifier = Modifier,
        tint: Color = AmbientContentColor.current
    ) {
        Icon(
            asset = vectorResource(id = resourceId),
            modifier = modifier,
            tint = tint
        )
    }
    

    You can then create an object elsewhere, like so:

    object MyAppIcons {
        val SomeIcon = R.drawable.someIcon
        val AnotherIcon = R.drawable.anotherIcon
    }
    

    When you put the two together, you can use it like this:

    MyAppIcon(MyAppIcons.SomeIcon)
    

    I'm hoping that Google just adds this override soon, allowing us to pass in resource IDs.