# ModifierLocalModifierNode

Artifact: [androidx.compose.ui:ui](https://developer.android.com/jetpack/androidx/releases/compose-ui) [View Source](https://cs.android.com/search?q=file:androidx/compose/ui/modifier/ModifierLocalModifierNode.kt+class:androidx.compose.ui.modifier.ModifierLocalModifierNode) Added in [1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.5.0) Common/All
- Cmn

  ```
  interface ModifierLocalModifierNode : ModifierLocalReadScope, DelegatableNode
  ```

*** ** * ** ***

A `https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier.Node` that is capable of consuming and providing `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocal` values.

This is the `https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier.Node` equivalent of the `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalConsumer` and `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalProvider` interfaces.

```kotlin
import androidx.compose.ui.Modifier
import androidx.compose.ui.modifier.ModifierLocalModifierNode
import androidx.compose.ui.modifier.modifierLocalMapOf
import androidx.compose.ui.modifier.modifierLocalOf
import androidx.compose.ui.node.LayoutAwareModifierNode
import androidx.compose.ui.node.ModifierNodeElement
import androidx.compose.ui.platform.InspectorInfo
import androidx.compose.ui.unit.IntSize

class Logger {
    fun log(string: String) {
        println(string)
    }
}

val loggerLocal = modifierLocalOf { Logger() }

class ProvideLoggerNode(logger: Logger) : ModifierLocalModifierNode, Modifier.Node() {
    override val providedValues = modifierLocalMapOf(loggerLocal to logger)
}

data class ProvideLoggerElement(val logger: Logger) : ModifierNodeElement<ProvideLoggerNode>() {
    override fun create() = ProvideLoggerNode(logger)

    override fun update(node: ProvideLoggerNode) {
        node.provide(loggerLocal, logger)
    }

    override fun InspectorInfo.inspectableProperties() {
        name = "provideLogger"
        properties["logger"] = logger
    }
}

class SizeLoggerNode(var id: String) :
    ModifierLocalModifierNode, LayoutAwareModifierNode, Modifier.Node() {
    override fun onRemeasured(size: IntSize) {
        loggerLocal.current.log("The size of $id was $size")
    }
}

data class SizeLoggerElement(val id: String) : ModifierNodeElement<SizeLoggerNode>() {
    override fun create() = SizeLoggerNode(id)

    override fun update(node: SizeLoggerNode) {
        node.id = id
    }

    override fun InspectorInfo.inspectableProperties() {
        name = "logSize"
        properties["id"] = id
    }
}

fun Modifier.logSize(id: String) = this then SizeLoggerElement(id)
fun Modifier.provideLogger(logger: Logger) = this then ProvideLoggerElement(logger)
```

| See also |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/package-summary#modifierLocalOf(kotlin.Function0)` |   |
| `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocal` |   |
| `https://developer.android.com/reference/kotlin/androidx/compose/runtime/CompositionLocal` |   |

## Summary

| ### Public functions |
|---|---|---|
| `open https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `<T : https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?> https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)(key: https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocal<T>, value: T)` This method will cause this node to provide a new `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)` for `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)`. | Cmn |

| ### Public properties |
|---|---|---|
| `open T` | `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocal<T>.https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#(androidx.compose.ui.modifier.ModifierLocal).current()` Read a `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocal` that was provided by other modifiers to the left of this modifier, or above this modifier in the layout tree. | Cmn |
| `open https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalMap` | `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#providedValues()` The map of provided ModifierLocal \<-\> value pairs that this node is providing. | Cmn |

### Inherited functions

From [androidx.compose.ui.node.DelegatableNode](https://developer.android.com/reference/kotlin/androidx/compose/ui/node/DelegatableNode) `open https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` `@https://developer.android.com/reference/kotlin/androidx/annotation/EmptySuper
https://developer.android.com/reference/kotlin/androidx/compose/ui/node/DelegatableNode#onDensityChange()()`

Invoked when the density changes for this node.
Cmn `open https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` `@https://developer.android.com/reference/kotlin/androidx/annotation/EmptySuper
https://developer.android.com/reference/kotlin/androidx/compose/ui/node/DelegatableNode#onLayoutDirectionChange()()`

Invoked when the layout direction changes for this node.
Cmn

### Inherited properties

From [androidx.compose.ui.node.DelegatableNode](https://developer.android.com/reference/kotlin/androidx/compose/ui/node/DelegatableNode) `https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier.Node` `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/DelegatableNode#node()`

A reference of the `https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier.Node` that holds this node's position in the node hierarchy.
Cmn

## Public functions

### provide

Cmn Added in [1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.5.0)

```
open fun <T : Any?> provide(key: ModifierLocal<T>, value: T): Unit
```

This method will cause this node to provide a new `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)` for `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)`. This can be called at any time on the UI thread, but in order to use this API, `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#providedValues()` must be implemented and `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)` must be a key that was included in it.

By providing this new value, any `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode` below it in the tree will read this `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)` when reading `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#(androidx.compose.ui.modifier.ModifierLocal).current()`, until another `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode` provides a value for the same `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)`, however, consuming `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode`s will NOT be notified that a new value was provided.

## Public properties

### ModifierLocal.current

Cmn Artifact: [androidx.compose.ui:ui](https://developer.android.com/jetpack/androidx/releases/compose-ui) [View Source](https://cs.android.com/search?q=file:androidx/compose/ui/modifier/ModifierLocalModifierNode.kt+symbol:current)

```
open val ModifierLocal<T>.current: T
```

Read a `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocal` that was provided by other modifiers to the left of this modifier, or above this modifier in the layout tree.

### providedValues

Cmn Added in [1.5.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.5.0)

```
open val providedValues: ModifierLocalMap
```

The map of provided ModifierLocal \<-\> value pairs that this node is providing. This value must be overridden if you are going to provide any values. It should be overridden as a field-backed property initialized with values for all of the keys that it will ever possibly provide.

By default, this property will be set to an empty map, which means that this node will only consume `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocal`s and will not provide any new values.

If you would like to change a value provided in the map over time, you must use the `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)` API.

| See also |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/package-summary#modifierLocalMapOf()` |   |
| `https://developer.android.com/reference/kotlin/androidx/compose/ui/modifier/ModifierLocalModifierNode#provide(androidx.compose.ui.modifier.ModifierLocal,kotlin.Any)` |   |