Compose Basic Codelab Unit 2 링크
Compose Camp Unit 1 Repository
if - else if - else
이것은 굳이 설명 없이 넘어갈게요!
when
if - else 에서 조건이 많을 경우 when을 사용하면 좋습니다.
when (parameter) {
condition1 -> body1
condition2 -> body2
}
// 예시: 다음과 같이 사용할 수 있어요.
when (x) {
1 -> println("1")
2 -> println("2")
3, 5 -> println("3 or 5")
in 10..19 -> println("10 ~ 19")
is Int -> println("Int")
}
? 를 사용하면 nullable,
!! 를 사용하면 non-null 값입니다.
var str ?= null
println(str?.length) // print null
println(str!!.length) // null exception
?:
(Elvis 연산자)를 사용할 수 있어요.
val len = str?.length ?: 0
// str이 null인 경우 print 0
val name = ClassName()
class SmartDevice(
val name: String, val category: String // primary constructor
) {
var deviceStatus = "online"
constructor( // 부생성자
name: String, category: String, statusCode: Int
) : this(name, category) { // this(주생성자의 파라미터)
deviceStatus = when (statusCode) {
0 -> "offline"
1 -> "online"
else -> "unknown"
}
}
...
}
// IS-A (Inherits) - 상속
// A: subClass, B: superClass
open B { fun func() } // using `open` keyword in superclass
class A : B() {
override fun func() {} // using `override` keyword in subclass
}
// HAS_A (contains/uses) - 포함
class A(
val b: B
)
Modifier | Accessible in same class | Accessible in subclass | Accessible in same module | Accessible outside module |
---|---|---|---|---|
private | ✔ | 𝗫 | 𝗫 | 𝗫 |
protected | ✔ | ✔ | 𝗫 | 𝗫 |
internal | ✔ | ✔ | ✔ | 𝗫 |
public | ✔ | ✔ | ✔ | ✔ |
(parameters) -> return type
val coins: (Int) -> String { quantity ->
"$quantity quarters"
}
for (iteration in start..end) { }
=> repeat(times) { iteration -> }
자세한 건 링크 참고 !!
remember
를 사용하여 리컴포지션에서 객체를 저장할 수 있다.
상태와 업데이트가 UI에 적절하게 반영되도록 일반적으로 remember
과 mutableStateOf
함수가 함께 사용된다.
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.getValue // 직접 가져와야 함
import androidx.compose.runtime.setValue // 직접 가져와야 함
var amount by remember { mutableStateOf("") }
TextField(
value = amount,
onValueChanged = { amount = it },
)
by
: Kotlin 속성 위임에 해당됨
@Composable
fun TipTimeScreen() {
var amountInput by remember { mutableStateOf("") }
val amount = amountInput.toDoubleOrNull() ?: 0.0
val tip = calculateTip(amount)
Column(
modifier = Modifier.padding(32.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
Text(
text = stringResource(R.string.calculate_tip),
fontSize = 24.sp,
modifier = Modifier.align(Alignment.CenterHorizontally)
)
Spacer(Modifier.height(16.dp))
EditNumberField(value = amountInput,
onValueChange = { amountInput = it }
)
Spacer(Modifier.height(24.dp))
Text(
text = stringResource(R.string.tip_amount, tip),
modifier = Modifier.align(Alignment.CenterHorizontally),
fontSize = 20.sp,
fontWeight = FontWeight.Bold
)
}
}
@Composable
fun EditNumberField(
value: String,
onValueChange: (String) -> Unit
) {
TextField(
value = value,
onValueChange = onValueChange,
label = { Text(stringResource(R.string.cost_of_service)) },
modifier = Modifier.fillMaxWidth(),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
}
amountInput
상태를 EditNumberField()
에서 TipTimeScreen()
composable로 호이스팅