Bookmark profile

안드로이드를 공부하려고 하니 어마어마하게 바뀌었다.

뭐 컴포저블 … ?

겨우겨우 할 일을 나타내는 요소 하나를 만들었다.

@Composable
fun Todo(
    todo: DSTodo,
    onChange: (DSTodo) -> Unit,
) {
    var vibrator = LocalContext.current.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    var name by remember { mutableStateOf(todo.name) }

    Row(
        verticalAlignment = Alignment.CenterVertically,
        modifier = Modifier.background(Color.DarkGray)
    ) {
        Button(
            onClick = {
                vibrator.vibrate(100)
                onChange(todo.copy(isDone = !todo.isDone))
            },
            shape = RoundedCornerShape(0.dp),
            contentPadding = PaddingValues(0.dp),
            colors = ButtonDefaults.buttonColors(
                containerColor = Color.White,
                contentColor = Color.Black,
            ),
            modifier = Modifier
                .background(Color.White)
                .width(48.dp)
                .height(48.dp)
                .padding(0.dp),
        ) {
            Image(
                painter = if (todo.isDone) {
                    painterResource(id = R.drawable.dream_circle_normal_part1)
                } else {
                    painterResource(id = R.drawable.dream_circle_empty_part)
                },
                contentDescription = null,
                modifier = Modifier.size(24.dp)
            )
        }
        BasicTextField(
            singleLine = true,
            value = name,
            onValueChange = {
                name = it
                onChange(todo.copy(name = name))
            },
            textStyle = TextStyle(
                background = Color.White,
            ),
            modifier = Modifier.padding(0.dp)
        )
    }
}

이거 하나를 만들면서 배운 내용

첫번째, 옛날에 안드로이드 배울 당시에는, getContext() 함수를 쓰거나 context를 직접 전달받아서 사용했던 기억이 있다. 하지만, 지금은 LocalContext.current를 사용하면 쉽게 context를 가져와서 사용할 수 있었다.

두번째, 이미지는 svg 파일도 Vector Asset으로 추가하면 png 다음과 같이 추가할 수 있다.

Image(
  painter = painterResource(id = R.drawable.dream_circle_normal_part1)
)

세번째, TextField 대신 BasicTextField를 쓴 이유는 버튼 자체의 크기가 정해져서 내 마음대로 조절하기 힘들기 때문이다.

네번째, 상태를 변경하는 경우, copy 함수를 사용해서 넣어주어야 한다.

onChange(todo.copy(name = name))