currentValueOf
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
local | The 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
}
}
}
}