Я стараюсь придерживаться лучших практик, сохраняя при этом код как можно более похожим на исходный код SwiftUI.
В SwiftUI вы можете поделиться переменной @State с подпредставлениями, объявив переменную как @Binding в подпредставлении, а затем добавив знак доллара при передаче ее из родительского представления, например итак:
Код: Выделить всё
struct ContentView: View {
@State private var isOn = false // Parent state
var body: some View {
VStack {
ToggleView(isOn: $isOn) // Passing a Binding to the child view
Text(isOn ? "The switch is ON" : "The switch is OFF")
}
.padding()
}
}
struct ToggleView: View {
@Binding var isOn: Bool // Binding property to update the parent's state
var body: some View {
Toggle("Switch", isOn: $isOn) // Use the Binding here
.padding()
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
Код: Выделить всё
@Composable
fun ContentView() {
var isOn by remember { mutableStateOf(false) } // Parent state
Column(modifier = Modifier.padding(16.dp)) {
ToggleView(isOn = isOn, onToggle = { isOn = it }) // Pass state and callback to child
Text(text = if (isOn) "The switch is ON" else "The switch is OFF")
}
}
@Composable
fun ToggleView(isOn: Boolean, onToggle: (Boolean) -> Unit) { // Accept state and callback
Switch(
checked = isOn, // Read the state
onCheckedChange = onToggle // Call callback to update parent state
)
}
@Preview
@Composable
fun PreviewContentView() {
ContentView()
}
Итак, вместо того, чтобы передавать значение MutableState в подпредставления, я попробовал передать весь объект MutableState, вот так:
Код: Выделить всё
@Composable
fun ContentView() {
val isOnState = remember { mutableStateOf(false) } // Parent state
var isOn by isOnState
Column(modifier = Modifier.padding(16.dp)) {
ToggleView(isOnState=isOnState) // Pass state and callback to child
Text(text = if (isOn) "The switch is ON" else "The switch is OFF")
}
}
@Composable
fun ToggleView(isOnState: MutableState) { // Accept state and callback
var isOn by isOnState
Switch(
checked = isOn, // Read the state
onCheckedChange = { isOn = it } // Call callback to update parent state
)
}
@Preview
@Composable
fun PreviewContentView() {
ContentView()
}
Итак, у меня есть следующие вопросы :
- Есть ли какие-то подводные камни, которые я упускаю?
- Можно ли передавать MutableState в качестве параметра, чтобы лучше воспроизвести способ обработки состояния SwiftUI. привязки?
Подробнее здесь: https://stackoverflow.com/questions/792 ... composable
Мобильная версия