Pantrix UI

Formlar

Bir formun alanlarını, kurallarını ve gönderilmesini nasıl tuttuğu, hangi girdinin neyi aldığı ve klavyeyi her platformda okurun yolundan neyin çektiği.

Üç parçada bir form

  1. Alanlarını kur

    FormState bir formu bir arada tutar: hangi alanın hatalı olduğunu, gönderilirken neyin beklediğini, Enter'ın ne yaptığını. form.field(id, initial, rules…) bir alan kurar; id'si formdaki adı ve ona bağlanan bileşenin otomasyon etiketidir.

    SignUpForm.kt

    val form = rememberFormState()
    val email = form.field(
        "email",
        initial = "",
        Rules.notBlank(stringResource(Res.string.email_required)),
        Rules.matches(EMAIL, stringResource(Res.string.email_invalid))
    )
    val password = form.field("password", initial = "", Rules.minLength(8, stringResource(Res.string.password_short)))
    val terms = form.field("terms", initial = false, Rules.mustBeTrue(stringResource(Res.string.terms_required)))
  2. Bileşenleri onlara bağla

    Bir field verilen bileşen tagKey almaz: alanın id'siyle etiketlenir.

    SignUpForm.kt

    PantrixTextField(
        field = email,
        form = form,
        label = stringResource(Res.string.email),
        keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email)
    )
    PantrixSecureTextField(field = password, form = form, label = stringResource(Res.string.password))
    PantrixCheckbox(field = terms, label = stringResource(Res.string.accept_terms))
  3. Gönder

    form.submit { … } her alanı denetler. Biri geçmezse odak hatalı ilk alana gider ve blok çalışmaz; blok çalışırken form verilen düğme yüklendiğini gösterir ve ikinci bir basışı almaz.

    SignUpForm.kt

    PantrixButton(
        text = stringResource(Res.string.sign_up),
        onClick = { scope.launch { form.submit { onSignUp(email.value, password.value) } } },
        form = form,
        tagKey = "sign_up"
    )

Kurallar

Bir kuralın söyledikleri
Rules.notBlankYazı boş ya da yalnızca boşluk değil
Rules.requiredBir değer seçilmiş: bir seçim kutusu, bir tarih
Rules.mustBeTrueBir onay verilmiş
Rules.minLength, Rules.maxLengthYazı yeterince uzun ya da yeterince kısa
Rules.matchesDeğerin tamamı bir kalıba uyuyor
Rules.satisfiesBaşka bir şeye bakan bir kural: iki kez yazılan bir parola

Alana dokunulmadan hata görünmez: odak ondan ayrıldığında ya da form gönderildiğinde görünür. Dokunulmuş bir alan her değişiklikte yeniden denetlenir.

Hangi girdi neyi alır

Değere göre
DeğerBileşen
Bir satır yazıPantrixTextField, PantrixFilledTextField
Birkaç satırlık yazıPantrixTextArea, PantrixFilledTextArea
Bir parolaPantrixSecureTextField
Evet ya da hayırPantrixCheckbox, PantrixSwitchButton
Hepsi görünen birkaç seçenekten biriPantrixRadioGroup
Bir listeden biri ya da birkaçıPantrixSelect, PantrixMultiSelect
Bir tarih, bir saatPantrixDateTextField, PantrixTimeTextField

Her platformda klavye

Kapatmak
iPhone'un klavyesinde birkaç satırlık bir alandan onu kapatan bir tuş yoktur. Ekranın kökündeki Modifier.clearFocusOnTap() dışarıya bir dokunuşta onu kapatır: Klavyeyi kapatma.
Sayılar
iPhone'un sayı tuş takımında eylem tuşu yoktur. numberKeyboardOptions(imeAction = ImeAction.Done) olanını ister: Sayı alanı ve eylem tuşu.
İçeriğin üstünde
Alanları olan bir ekran, içeriğindeki Modifier.imePadding() ile onları klavyeden uzak tutar.
Enter
form verilen bir metin alanında klavyenin eylem tuşu formu gönderir; bir metin kutusunda yeni satırdır, Ctrl ya da Cmd ile Enter gönderir.

Sırada ne var