# TraversableNode

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/node/TraversableNode.kt+class:androidx.compose.ui.node.TraversableNode) Added in [1.6.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.6.0) Common/AllAndroid/JVM
- Cmn

  ```
  interface TraversableNode : DelegatableNode
  ```

*** ** * ** ***

Allows `https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier.Node` classes to traverse up/down the Node tree for classes of the same type or for a particular key (traverseKey).

Note: The actual traversals are done in extension functions (see bottom of file).

## Summary

| ### Nested types |
|---|
| `object https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode.Companion` |
| `enum https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode.Companion.TraverseDescendantsAction : https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-enum/index.html<https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode.Companion.TraverseDescendantsAction>` Tree traversal actions for the traverseDescendantsIf related functions: |

| ### Public properties |
|---|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html` | `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode#traverseKey()` | Cmn |

| ### Extension functions |
|---|---|---|
| `T?` | `<T : https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode> T.https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode#(androidx.compose.ui.node.TraversableNode).findNearestAncestor()()` Finds the nearest ancestor of the same class and key. | Cmn |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `<T : https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode> T.https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode#(androidx.compose.ui.node.TraversableNode).traverseAncestors(kotlin.Function1)(block: (T) -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html)` Executes `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseAncestors(kotlin.Function1)` for all ancestors of the same class and key. | Cmn |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `<T : https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode> T.https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode#(androidx.compose.ui.node.TraversableNode).traverseChildren(kotlin.Function1)(block: (T) -> https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html)` Executes `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseChildren(kotlin.Function1)` for all direct children of the node that are of the same class. | Cmn |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `<T : https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode> T.https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode#(androidx.compose.ui.node.TraversableNode).traverseDescendants(kotlin.Function1)( block: (T) -> https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode.Companion.TraverseDescendantsAction )` Conditionally executes `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseDescendants(kotlin.Function1)` for each descendant of the same class. | 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 properties

### traverseKey

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

```
val traverseKey: Any
```

## Extension functions

### T.findNearestAncestor

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/node/TraversableNode.kt+function:findNearestAncestor)

```
fun <T : TraversableNode> T.findNearestAncestor(): T?
```

Finds the nearest ancestor of the same class and key.

### T.traverseAncestors

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/node/TraversableNode.kt+function:traverseAncestors)

```
fun <T : TraversableNode> T.traverseAncestors(block: (T) -> Boolean): Unit
```

Executes `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseAncestors(kotlin.Function1)` for all ancestors of the same class and key.

Note: The parameter `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseAncestors(kotlin.Function1)`'s return boolean value will determine if the traversal will continue (true = continue, false = cancel).

```kotlin
import androidx.compose.ui.Modifier
import androidx.compose.ui.node.traverseAncestors

val customTraversableModifierNode = CustomTraversableModifierNode()

with(customTraversableModifierNode) {
    traverseAncestors {
        // Because I use the existing key of the class, I can guarantee 'it' will be of the same
        // type as the class, so I can call my functions directly.
        it.doSomethingWithAncestor()

        // Return true to continue searching the tree after a match. If you were looking to
        // match only some of the nodes, you could return false and stop executing the search.
        true
    }
}
```

### T.traverseChildren

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/node/TraversableNode.kt+function:traverseChildren)

```
fun <T : TraversableNode> T.traverseChildren(block: (T) -> Boolean): Unit
```

Executes `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseChildren(kotlin.Function1)` for all direct children of the node that are of the same class.

Note 1: This stops at the children and does not include grandchildren and so on down the tree.

Note 2: The parameter `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseChildren(kotlin.Function1)`'s return boolean value will determine if the traversal will continue (true = continue, false = cancel).

```kotlin
import androidx.compose.ui.Modifier
import androidx.compose.ui.node.traverseChildren

val customTraversableModifierNode = CustomTraversableModifierNode()

with(customTraversableModifierNode) {
    traverseChildren {
        // Because I use the existing key of the class, I can guarantee 'it' will be of the same
        // type as the class, so I can call my functions directly.
        it.doSomethingWithChild()

        // Return true to continue searching the tree after a match. If you were looking to
        // match only some of the nodes, you could return false and stop executing the search.
        true
    }
}
```

### T.traverseDescendants

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/node/TraversableNode.kt+function:traverseDescendants)

```
fun <T : TraversableNode> T.traverseDescendants(
    block: (T) -> TraversableNode.Companion.TraverseDescendantsAction
): Unit
```

Conditionally executes `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseDescendants(kotlin.Function1)` for each descendant of the same class.

Note 1: For nodes that do not have the same key, it will continue to execute the `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseDescendants(kotlin.Function1)` for the descendants below that non-matching node (where there may be a node that matches).

Note 2: The parameter `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/package-summary#(androidx.compose.ui.node.TraversableNode).traverseDescendants(kotlin.Function1)`'s return value `https://developer.android.com/reference/kotlin/androidx/compose/ui/node/TraversableNode.Companion.TraverseDescendantsAction` will determine the next step in the traversal.

```kotlin
import androidx.compose.ui.Modifier
import androidx.compose.ui.node.TraversableNode.Companion.TraverseDescendantsAction
import androidx.compose.ui.node.traverseDescendants

val customTraversableModifierNode = CustomTraversableModifierNode()

with(customTraversableModifierNode) {
    traverseDescendants {
        // Because I use the existing key of the class, I can guarantee 'it' will be of the same
        // type as the class, so I can call my functions directly.
        it.doSomethingWithDescendant()

        // [traverseDescendants()] actually has three options:
        // - ContinueTraversal
        // - SkipSubtreeAndContinueTraversal - rarely used
        // - CancelTraversal
        // They are pretty self explanatory. Usually, you just want to continue or cancel the
        // search. In some rare cases, you might want to skip the subtree but continue searching
        // the tree.
        TraverseDescendantsAction.ContinueTraversal
    }
}
```