currentValueOf

Function

Common
fun <T> CompositionLocalConsumerModifierNode.currentValueOf(local: CompositionLocal<T>): T

Returns the current value of local at the position in the composition hierarchy of this modifier's attached layout node.

Unlike CompositionLocal.current, reads via this function are not automatically tracked by Compose. Modifiers are not able to recompose in the same way that a Composable can, and therefore can't receive updates arbitrarily for a CompositionLocal.

Because CompositionLocals may change arbitrarily, it is strongly recommended to ensure that the composition local is observed instead of being read once. If you call currentValueOf inside of a modifier callback like LayoutModifierNode.measure or DrawModifierNode.draw, then Compose will track the CompositionLocal read. This happens automatically, because these Compose UI phases take place in a snapshot observer that tracks which states are read. If the value of the CompositionLocal changes, and it was read inside of the measure or draw phase, then that phase will automatically be invalidated.

For all other reads of a CompositionLocal, this function will not notify you when the value of the local changes. Modifier.Node classes that also implement ObserverModifierNode may observe CompositionLocals arbitrarily by performing the lookup in an observeReads block. To continue observing values of the CompositionLocal, it must be read again in an observeReads block during or after the ObserverModifierNode.onObservedReadsChanged callback is invoked. See below for an example of how to implement this observation pattern.

This function will fail with an IllegalStateException if you attempt to read a CompositionLocal before the node is attached or after the node is detached.

Parameters

localThe CompositionLocal to get the current value of

Returns

The value provided by the nearest CompositionLocalProvider component that invokes, directly or indirectly, the composable function that this modifier is attached to. If local was never provided, its default value will be returned instead.

Code Examples

CompositionLocalConsumingModifierObserverNodeSample

@Composable
fun CompositionLocalConsumingModifierObserverNodeSample() {
    val LocalValue = compositionLocalOf { "abc123" }
    class ValueObserverModifierNode :
        Modifier.Node(), CompositionLocalConsumerModifierNode, ObserverModifierNode {
        private var observedValue: String? = null
        override fun onAttach() {
            onObservedReadsChanged()
        }
        override fun onDetach() {
            observedValue = null
        }
        override fun onObservedReadsChanged() {
            observeReads {
                observedValue = currentValueOf(LocalValue)
                // Do something with the new value
            }
        }
    }
}