Skip to content

Commit 334dacc

Browse files
authored
Update moko-fields.md
добавление про отсутствие двусторонней связки для compose, пример реализации text field с onValueChanged
1 parent aeca3e6 commit 334dacc

File tree

1 file changed

+41
-4
lines changed

1 file changed

+41
-4
lines changed

learning/libraries/moko/moko-fields.md

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,52 @@ sidebar_position: 6
1515
## FormField
1616

1717
Потребность в библиотеке возникла из-за того, что для создания логики формы ввода в общем коде необходимы следующие элементы:
18-
- `LiveData(String)` - текст поля
19-
- `LiveData(Bool)` - валидно/невалидно поле
20-
- `LiveData(String)` - текст ошибки валидации
18+
- `LiveData/StateFlow(String)` - текст поля
19+
- `LiveData/StateFlow(Bool)` - валидно/невалидно поле
20+
- `LiveData/StateFlow(String)` - текст ошибки валидации
2121

2222
А представьте, что у вас 7 или 8 таких полей, получится много однотипного кода, в котором легко будет запутаться и допустить ошибку.
2323

24-
Библиотека позволяет использовать специальный класс `FormField` для форм ввода, который включает в себя все эти три лайвдаты.
24+
Библиотека позволяет использовать специальный класс `FormField` для форм ввода, который включает в себя все эти три лайвдаты/стейт флоу.
2525

2626
Для создания `FormField` необходимо только установить тип и задать валидацию для этого значения. Тип поля не обязательно должен быть `String`, подойдет любой, который можно как-то установить: `int`, `bitmap`, `data` и тд.
2727

28+
Для Jetpack Compose и Compose Multiplatform двусторонная связка для передачи значения введенного текста поля в View Model не работает, необходимо реализовывать на UI TextField c onValueChange.<br/>
29+
В коде экрана:
30+
31+
```kotlin
32+
val (code, onCodeChange) = viewModel.code.data.collectAsMutableState()
33+
34+
AuthCodeContent(
35+
code = code,
36+
onCodeChange = onCodeChange,
37+
codeError = viewModel.code.error.collectAsState().value?.localized(),
38+
...
39+
)
40+
```
41+
В контенте экрана:
42+
```kotlin
43+
@Composable
44+
fun AuthCodeContent(
45+
code: String,
46+
onCodeChange: (String) -> Unit,
47+
codeError: String?,
48+
...
49+
) {
50+
...
51+
BasicTextField(
52+
...
53+
value = code,
54+
onValueChange = { newValue ->
55+
onCodeChange(newValue)
56+
},
57+
isError = codeError !=null
58+
)
59+
...
60+
}
61+
62+
```
63+
2864
## Валидация
2965
Разберем, как добавлять валидацию в `FormField`:
3066
- можно использовать [встроенные валидаторы](https://github.com/icerockdev/moko-fields/tree/c9c09069da717d4995ee6c96f8ec6ef7446af503/fields/src/commonMain/kotlin/dev/icerock/moko/validations)
@@ -36,3 +72,4 @@ sidebar_position: 6
3672
- поля можно объединить в список и валидировать их одновременно
3773
- валидация полей может быть завязана на других полях (пароль + повторите пароль)
3874
- у FormField есть поле `isValid` и `validationError`
75+

0 commit comments

Comments
 (0)