การตรวจสอบข้อมูลนำเข้า
ตรวจสอบข้อมูลนำเข้าและแสดงข้อผิดพลาดที่ช่วยแก้ปัญหาได้
การตรวจสอบข้อมูลนำเข้า เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- TextField และข้อมูลนำเข้าจากผู้ใช้
- การจัดการสถานะแบบฟอร์ม
- การตรวจสอบข้อมูลนำเข้า
- ตัวเลือกและการทำงานของแป้นพิมพ์