0Pricing
Android Academy · บทเรียน

การตรวจสอบข้อมูลนำเข้า

ตรวจสอบข้อมูลนำเข้าและแสดงข้อผิดพลาดที่ช่วยแก้ปัญหาได้

การตรวจสอบข้อมูลนำเข้า เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุผลที่ต้องตรวจสอบอินพุต

ผู้ใช้ย่อมทำผิดพลาดได้ เช่น ชื่อว่าง อีเมลมีรูปแบบไม่ถูกต้อง หรือรหัสผ่านสั้นเกินไป ฟอร์มที่ดีจะตรวจจับปัญหาเหล่านี้ตั้งแต่เนิ่น ๆ และอธิบายอย่างชัดเจนว่าควรแก้ไขอะไร

ในบทเรียนนี้ คุณจะเพิ่มการตรวจสอบให้ฟอร์ม Compose แสดงข้อผิดพลาดในฟอร์ม และปิดใช้งานปุ่มส่งจนกว่าทุกอย่างจะถูกต้อง

กฎการตรวจสอบก็คือฟังก์ชัน

เขียนตรรกะการตรวจสอบเป็นฟังก์ชัน Kotlin ธรรมดาที่รับค่าและส่งกลับว่าค่านั้นถูกต้องหรือไม่ (หรือส่งกลับข้อความข้อผิดพลาด) วิธีนี้ทำให้สามารถนำกฎกลับมาใช้ใหม่และทดสอบได้ง่าย

ต่อไปนี้คือตัวอย่างการตรวจสอบอีเมลอย่างง่าย

fun emailError(email: String): String? = when {
    email.isBlank() -> "Email is required"
    !email.contains("@") -> "Enter a valid email"
    else -> null
}

การแสดงข้อผิดพลาดบนฟิลด์

OutlinedTextField มีแฟล็ก isError และช่อง supportingText คุณสามารถใช้ทั้งสองอย่างร่วมกันเพื่อแสดงฟิลด์สีแดงพร้อมข้อความด้านล่าง

ข้อผิดพลาดจะมาจากฟังก์ชันตรวจสอบของคุณโดยตรง

var email by remember { mutableStateOf("") }
val error = emailError(email)

OutlinedTextField(
    value = email,
    onValueChange = { email = it },
    label = { Text("Email") },
    isError = error != null,
    supportingText = { if (error != null) Text(error) }
)

อย่าแจ้งเตือนเร็วเกินไป

การแสดง "จำเป็นต้องกรอกอีเมล" ก่อนที่ผู้ใช้จะได้แตะฟิลด์นั้นอาจทำให้รู้สึกไม่เป็นมิตร วิธีแก้ที่ใช้กันทั่วไปคือ ติดตามว่าฟิลด์ถูก touched แล้วหรือไม่ และแสดงข้อผิดพลาดหลังจากนั้นเท่านั้น

ในที่นี้ เราจะทำเครื่องหมายว่าฟิลด์ถูกแตะเมื่อฟิลด์สูญเสียโฟกัส

var email by remember { mutableStateOf("") }
var touched by remember { mutableStateOf(false) }
val error = if (touched) emailError(email) else null

OutlinedTextField(
    value = email,
    onValueChange = { email = it },
    label = { Text("Email") },
    isError = error != null,
    modifier = Modifier.onFocusChanged {
        if (!it.isFocused) touched = true
    }
)

การตรวจสอบรหัสผ่าน

รหัสผ่านมักมีกฎหลายข้อ ให้ส่งกลับกฎข้อแรกที่ไม่ผ่าน เพื่อให้ผู้ใช้แก้ไขทีละประเด็น

สังเกตว่านี่ยังคงเป็นฟังก์ชันบริสุทธิ์ที่ไม่มีส่วนติดต่อผู้ใช้อยู่ภายใน

fun passwordError(pw: String): String? = when {
    pw.length < 8 -> "At least 8 characters"
    pw.none { it.isDigit() } -> "Add a number"
    pw.none { it.isUpperCase() } -> "Add an uppercase letter"
    else -> null
}

การตรวจสอบระหว่างฟิลด์

กฎบางข้อเกี่ยวข้องกับฟิลด์สองรายการ เช่น "การยืนยันรหัสผ่านต้องตรงกับรหัสผ่าน" กฎเหล่านี้ไม่สามารถอยู่ในฟังก์ชันที่ตรวจสอบฟิลด์เดียวได้ จึงต้องคำนวณในจุดที่มีค่าทั้งสองรายการพร้อมใช้งาน

var password by remember { mutableStateOf("") }
var confirm by remember { mutableStateOf("") }

val confirmError =
    if (confirm.isNotEmpty() && confirm != password)
        "Passwords don't match"
    else null

ปิดการส่งจนกว่าจะถูกต้อง

ฟอร์มทั้งหมดจะถูกต้องเมื่อกฎทุกข้อผ่าน ให้คำนวณค่าบูลีนเพียงค่าเดียว แล้วใช้ค่านั้นเปิดหรือปิดใช้งานปุ่มส่ง

วิธีนี้จะป้องกันไม่ให้ผู้ใช้ส่งข้อมูลที่ไม่ถูกต้องตั้งแต่แรก

val formValid =
    emailError(email) == null &&
    passwordError(password) == null &&
    confirmError == null

Button(onClick = { submit() }, enabled = formValid) {
    Text("Create Account")
}

ตรวจสอบเมื่อกดส่ง

การตรวจสอบในฟอร์มช่วยแนะนำผู้ใช้ แต่คุณควรตรวจสอบทุกอย่างซ้ำอีกครั้งเมื่อผู้ใช้กดส่ง ตัวจัดการการส่งจะตัดสินใจว่าจะดำเนินการต่อหรือแสดงข้อผิดพลาดทั้งหมดพร้อมกัน

fun onSubmit() {
    val errors = listOfNotNull(
        emailError(email),
        passwordError(password)
    )
    if (errors.isEmpty()) {
        register(email, password)
    } else {
        // show errors / mark fields touched
    }
}

จำกัดสิ่งที่สามารถพิมพ์ได้

การตรวจสอบยังทำหน้าที่ป้องกันได้ด้วย สำหรับหมายเลขโทรศัพท์ ให้ละเว้นอักขระที่ไม่ใช่ตัวเลขภายใน onValueChange เพื่อไม่ให้อินพุตที่ไม่ถูกต้องเข้าสู่สถานะตั้งแต่แรก

วิธีนี้เป็นมิตรต่อผู้ใช้มากกว่าการตำหนิผู้ใช้ภายหลัง

var phone by remember { mutableStateOf("") }

OutlinedTextField(
    value = phone,
    onValueChange = { input ->
        phone = input.filter { it.isDigit() }.take(10)
    },
    label = { Text("Phone") }
)

รวมการตรวจสอบไว้ใน ViewModel

สำหรับหน้าจอจริง ให้เก็บการตรวจสอบไว้ใน ViewModel เพื่อให้ส่วนติดต่อผู้ใช้มีหน้าที่เพียงแสดงผล ViewModel จะเปิดเผยข้อผิดพลาดและแฟล็ก isValid

วิธีนี้ช่วยให้ composable มีความซับซ้อนน้อย และกฎต่าง ๆ สามารถทดสอบแบบหน่วยได้

class SignUpViewModel : ViewModel() {
    var email by mutableStateOf("")
        private set

    val emailError: String?
        get() = emailError(email)

    val isValid: Boolean
        get() = emailError == null && email.isNotBlank()

    fun onEmailChange(value: String) { email = value }
}

Kotlin ล้วน: การทดสอบกฎ

เนื่องจากตัวตรวจสอบเป็นฟังก์ชันบริสุทธิ์ คุณจึงเรียกใช้ได้จากทุกที่ ในที่นี้ กฎสำหรับอีเมลและรหัสผ่านทำงานแยกเป็นอิสระ เช่นเดียวกับที่การทดสอบหน่วยจะเรียกใช้กฎเหล่านี้

fun emailError(email: String): String? = when {
    email.isBlank() -> "Email is required"
    !email.contains("@") -> "Enter a valid email"
    else -> null
}

fun main() {
    println(emailError(""))
    println(emailError("nope"))
    println(emailError("ada@dev.io"))
}

ตรวจสอบความเข้าใจ

คุณสมบัติคู่ใดของ OutlinedTextField ที่ใช้ทำเครื่องหมายว่าฟิลด์ไม่ถูกต้องและแสดงข้อความด้านล่าง

สรุปทบทวน

ตอนนี้คุณสามารถตรวจสอบฟอร์ม Compose ได้อย่างเป็นระเบียบแล้ว:

  • เขียนกฎเป็นฟังก์ชันบริสุทธิ์ที่ส่งกลับข้อความข้อผิดพลาดหรือค่า null
  • แสดงข้อผิดพลาดด้วย isError + supportingText และหลีกเลี่ยงการแจ้งเตือนก่อนที่ผู้ใช้จะแตะฟิลด์
  • จัดการกฎระหว่างฟิลด์ในจุดที่มองเห็นค่าทั้งสองรายการ
  • ปิดการส่งจนกว่าฟอร์มทั้งหมดจะถูกต้อง และตรวจสอบซ้ำเมื่อกดส่ง
  • ป้องกันอินพุตที่ไม่ถูกต้องด้วย filter และรวมกฎไว้ใน ViewModel

ถัดไป: ชนิดแป้นพิมพ์ การทำงานของ IME และการจัดการโฟกัส

คำถามที่พบบ่อย

บทเรียน “การตรวจสอบข้อมูลนำเข้า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การตรวจสอบข้อมูลนำเข้า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การตรวจสอบข้อมูลนำเข้า”

ตรวจสอบข้อมูลนำเข้าและแสดงข้อผิดพลาดที่ช่วยแก้ปัญหาได้ คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การตรวจสอบข้อมูลนำเข้า” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. TextField และข้อมูลนำเข้าจากผู้ใช้
  2. การจัดการสถานะแบบฟอร์ม
  3. การตรวจสอบข้อมูลนำเข้า
  4. ตัวเลือกและการทำงานของแป้นพิมพ์
← กลับไปที่ Android Academy