# Jetpack Compose Material 3 unifies theme data in LocalMaterialTheme

DevFeed: [Jetpack Compose Material 3 unifies theme data in LocalMaterialTheme](<https://devfeed.tech/articles/localmaterialtheme-from-prop-hell-to-theme-nirvana-material3-25984.md>)

Original publisher: [Read original article](<https://proandroiddev.com/localmaterialtheme-from-prop-hell-to-theme-nirvana-material3-38b3c01ab7d4?source=rss-711ab22c5c77------2>)

Author: Nav Singh

Published: 2026-03-12T19:38:30Z

Content type: tutorial

Language: en

Sources: [Stories by Nav Singh 🇨🇦 on Medium](<https://devfeed.tech/sources/stories-by-nav-singh-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Design system](<https://devfeed.tech/topics/design-system.md>)

Tags: [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [design-systems](<https://devfeed.tech/tags/design-systems.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [material-design](<https://devfeed.tech/tags/material-design.md>), [material3](<https://devfeed.tech/tags/material3.md>)

## AI overview

Jetpack Compose Material 3 1.5.0-alpha15 changes MaterialTheme to use one LocalMaterialTheme CompositionLocal for color, typography, shapes, and motion. The article explains how this can simplify theme management and allow custom modifier nodes to read theme data outside composable scopes.

## Source excerpt

Image generated using Perplexity Jetpack Compose Material 3 1.5.0-alpha15 introduces a subtle but powerful refactor MaterialTheme now uses a single LocalMaterialTheme CompositionLocal instead of separate locals for color, typography, shapes, and motion. While this simplifies internal theme management, its real value emerges when building custom design systems and theme-aware Modifier libraries. The Refactor: Cleaner Under the Hood Previously, MaterialTheme relied on multiple CompositionLocals: Source:https://android-review.googlesource.com/c/platform/frameworks/support/+/3949000/16/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt Now: Everything flows through one unified source: Source:https://android-review.googlesource.com/c/platform/frameworks/support/+/3949000/16/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.ktThis reduces allocations and simplifies the theme provider.⭐ Where It Shines: Design Systems & Custom Modifiers ⭐ The game-changer is CompositionLocalConsumerModifierNode support. Custom Modifiers that handle drawing/layout outside @Composable scopes can now read theme data directly:object BrandGradientOverlayElement : ModifierNodeElement<BrandGradientOverlayNode>() { override fun create(): BrandGradientOverlayNode = BrandGradientOverlayNode() override fun update(node: BrandGradientOverlayNode) { // No-Op } override fun InspectorInfo.inspectableProperties() { name = "brandGradientOverlay" } override fun equals(other: Any?): Boolean = (this === other) override fun hashCode(): Int = javaClass.hashCode() } class BrandGradientOverlayNode : Modifier.Node(), DrawModifierNode, CompositionLocalConsumerModifierNode { override fun ContentDrawScope.draw() { // Read color scheme to access colors val colorScheme = currentValueOf(MaterialTheme.LocalMaterialTheme).colorScheme val gradient = Brush.linearGradient( listOf( colorScheme.primary, colorScheme.secondary) ) drawContent() d