@@ -19,8 +19,12 @@ import androidx.compose.ui.node.DelegatableNode
1919import androidx.compose.ui.node.DelegatingNode
2020import androidx.compose.ui.node.ModifierNodeElement
2121import androidx.compose.ui.node.PointerInputModifierNode
22+ import androidx.compose.ui.node.SemanticsModifierNode
2223import androidx.compose.ui.platform.debugInspectorInfo
2324import androidx.compose.ui.semantics.Role
25+ import androidx.compose.ui.semantics.SemanticsPropertyReceiver
26+ import androidx.compose.ui.semantics.onClick
27+ import androidx.compose.ui.semantics.role
2428import androidx.compose.ui.unit.IntSize
2529import kotlinx.coroutines.coroutineScope
2630import kotlinx.coroutines.launch
@@ -59,10 +63,14 @@ fun Modifier.noRippleClickable(onClick: () -> Unit): Modifier = this.clickable(
5963 */
6064fun Modifier.noRippleClickableSingle (
6165 enabled : Boolean = true,
66+ onClickLabel : String? = null,
67+ role : Role ? = null,
6268 onClick : () -> Unit ,
6369): Modifier = this .then(
6470 ClickableSingleElement (
6571 enabled = enabled,
72+ onClickLabel = onClickLabel,
73+ role = role,
6674 onClick = onClick,
6775 indicationNodeFactory = null ,
6876 ),
@@ -101,17 +109,23 @@ fun Modifier.clickableSingleComposed(
101109 */
102110fun Modifier.clickableSingle (
103111 enabled : Boolean = true,
112+ onClickLabel : String? = null,
113+ role : Role ? = null,
104114 onClick : () -> Unit ,
105115): Modifier = this .then(
106116 ClickableSingleElement (
107117 enabled = enabled,
118+ onClickLabel = onClickLabel,
119+ role = role,
108120 onClick = onClick,
109121 indicationNodeFactory = ripple(),
110122 ),
111123)
112124
113125private data class ClickableSingleElement (
114126 private val enabled : Boolean ,
127+ private val onClickLabel : String? ,
128+ private val role : Role ? ,
115129 private val onClick : () -> Unit ,
116130 private val indicationNodeFactory : IndicationNodeFactory ? ,
117131) : ModifierNodeElement<ClickableSingleNode>() {
@@ -121,6 +135,8 @@ private data class ClickableSingleElement(
121135 Log .d(TAG , " ✅ Node: CREATE #${ClickableTestCounter .nodeCreateCount} - Element 객체ID = ${System .identityHashCode(this )} " )
122136 return ClickableSingleNode (
123137 enabled = enabled,
138+ onClickLabel = onClickLabel,
139+ role = role,
124140 onClick = onClick,
125141 indicationNodeFactory = indicationNodeFactory,
126142 )
@@ -131,6 +147,8 @@ private data class ClickableSingleElement(
131147 Log .d(TAG , " 🔄 Node: UPDATE #${ClickableTestCounter .nodeUpdateCount} - Element 객체ID = ${System .identityHashCode(this )} , Node 객체ID = ${System .identityHashCode(node)} " )
132148 node.update(
133149 enabled = enabled,
150+ onClickLabel = onClickLabel,
151+ role = role,
134152 onClick = onClick,
135153 indicationNodeFactory = indicationNodeFactory,
136154 )
@@ -139,9 +157,11 @@ private data class ClickableSingleElement(
139157
140158private class ClickableSingleNode (
141159 private var enabled : Boolean ,
160+ private var onClickLabel : String? ,
161+ private var role : Role ? ,
142162 private var onClick : () -> Unit ,
143163 private var indicationNodeFactory : IndicationNodeFactory ? ,
144- ) : DelegatingNode(), PointerInputModifierNode {
164+ ) : DelegatingNode(), PointerInputModifierNode, SemanticsModifierNode {
145165
146166 private val multipleEventsCutter = MultipleEventsCutter .get()
147167 private var interactionSource: MutableInteractionSource ? = null
@@ -208,13 +228,22 @@ private class ClickableSingleNode(
208228 pointerInputNode.onCancelPointerInput()
209229 }
210230
231+ override fun SemanticsPropertyReceiver.applySemantics () {
232+ this @ClickableSingleNode.role?.let { this .role = it }
233+ onClick(label = onClickLabel, action = { processClick(); true })
234+ }
235+
211236 fun update (
212237 enabled : Boolean ,
238+ onClickLabel : String? ,
239+ role : Role ? ,
213240 onClick : () -> Unit ,
214241 indicationNodeFactory : IndicationNodeFactory ? ,
215242 ) {
216243 val indicationChanged = this .indicationNodeFactory != indicationNodeFactory
217244 this .enabled = enabled
245+ this .onClickLabel = onClickLabel
246+ this .role = role
218247 this .onClick = onClick
219248
220249 if (indicationChanged) {
0 commit comments