Можно ли передать MutableState в качестве параметра в Composable?IOS

Программируем под IOS
Ответить
Anonymous
 Можно ли передать MutableState в качестве параметра в Composable?

Сообщение Anonymous »

Я учился использовать Jetpack Compose на основе проекта, разработанного с использованием SwiftUI. Цель — перенести приложение iOS на Android.
Я стараюсь придерживаться лучших практик, сохраняя при этом код как можно более похожим на исходный код 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()
}
}
}
Официальная документация Jetpack Compose, с другой стороны, рекомендует следовать шаблону однонаправленного потока данных, например:

Код: Выделить всё

@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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»