Bookmark profile

드래거블 리스트를 구현하다가 선언적 컴포즈 사용방법을 배우게 되었다. 해당 방식은 조금 특이한 방식이기 때문에 선언적 방식과 그 방식을 일반적인 방식으로 풀어서 쓴 코드를 첨부해 보겠다.

@Composable
fun DraggableItem(
    content: @Composable ColumnScope.(isDragging: Boolean) -> Unit
) {
  val isDragging = false
  content(isDragging)
}

위와같은 방식을 일반적으로 사용하는 방법은 다음과 같다.

@Composable
fun MyDraggableColumn(isDragging: Boolean) {
    Column {
        DragIndicator(isDragging)
        // 다른 UI 요소들
    }
}

@Composable
fun DragIndicator(isDragging: Boolean) {
    if (isDragging) {
        Text("Dragging...")
    } else {
        Text("Not dragging")
    }
}

다시말해, content 라는 파라미터로 전달해야 하는 값은, 컴포즈의 자식 요소를 의미한다.

즉, 모든 컴포즈의 자식 요소를 정의할 때에는 content를 사용할 수 있으며, 그 타입은 별도로 지정해서 사용해야 한다.

content가 자식 요소를 의미하기 때문에 DraggableItem을 사용하는 방법은 다음과 같다.

DraggableItem(...) {
  Column {
    ...
  }
}