في لغة Dart، يمكنك التعامل مع إدخال المستخدم في تطبيقات Console (سطر الأوامر) باستخدام مكتبة dart:io
. إليك شرح مفصل مع أمثلة:
1. قراءة إدخال نصي (String)
استخدم الدالة stdin.readLineSync()
لقراءة سطر كامل من الإدخال.
مثال بسيط:
dart
Copy
import 'dart:io'; void main() { print("أدخل اسمك:"); String? name = stdin.readLineSync(); print("مرحباً، $name!"); }
النتيجة:
Copy
أدخل اسمك: Ahmed مرحباً، Ahmed!
2. قراءة إدخال رقمي (int أو double)
تحويل الإدخال النصي إلى رقم باستخدام int.parse()
أو double.parse()
.
ملاحظة: يجب التعامل مع الأخطاء إذا أدخل المستخدم نصًا غير رقمي.
مثال مع التحقق من الأخطاء:
dart
Copy
import 'dart:io'; void main() { print("أدخل عمرك:"); String? input = stdin.readLineSync(); try { int age = int.parse(input!); print("عمرك هو: $age سنة"); } catch (e) { print("خطأ! أدخل رقمًا صحيحًا."); } }
النتيجة (إذا أدخل المستخدم 25
):
Copy
عمرك هو: 25 سنة
النتيجة (إذا أدخل المستخدم abc
):
Copy
خطأ! أدخل رقمًا صحيحًا.
3. التعامل مع الإدخال بشكل متكرر حتى يصبح صحيحًا
يمكن استخدام حلقة while
للطلب من المستخدم إعادة الإدخال عند الخطأ.
مثال:
dart
Copy
import 'dart:io'; void main() { int? age; bool isValid = false; while (!isValid) { print("أدخل عمرك:"); String? input = stdin.readLineSync(); try { age = int.parse(input!); isValid = true; } catch (e) { print("خطأ! أدخل رقمًا صحيحًا."); } } print("عمرك المقبول: $age"); }
4. قراءة إدخال غير متزامن (Asynchronous)
استخدم stdin.readLine()
مع await
للقراءة بشكل غير متزامن (يتطلب استخدام async
).
مثال:
dart
Copy
import 'dart:io'; import 'dart:async'; void main() async { print("أدخل بلدك:"); String? country = await stdin.readLine(); print("بلدك: $country"); }
5. قراءة إدخال من نوع bool
تحويل الإدخال النصي إلى قيمة منطقية (true
/false
).
مثال:
dart
Copy
import 'dart:io'; void main() { print("هل أنت مسجل؟ (نعم/لا):"); String? answer = stdin.readLineSync()?.toLowerCase(); bool isRegistered = (answer == "نعم"); print("الحالة: $isRegistered"); }
6. قراءة إدخال متعدد القيم
تقسيم الإدخال إلى أجزاء باستخدام split()
.
مثال:
dart
Copy
import 'dart:io'; void main() { print("أدخل رقمين مفصولين بمسافة:"); String? input = stdin.readLineSync(); List<String> parts = input!.split(' '); if (parts.length == 2) { double num1 = double.parse(parts[0]); double num2 = double.parse(parts[1]); print("المجموع: ${num1 + num2}"); } else { print("صيغة خاطئة!"); } }
ملاحظات مهمة:
- الاستخدام في تطبيقات Flutter:
- في تطبيقات Flutter، يتم التعامل مع إدخال المستخدم عبر Widgets مثل
TextField
، وليس عبرdart:io
. - مثال:dartCopyTextField( decoration: InputDecoration(labelText: “أدخل اسمك”), onChanged: (value) { print(“القيمة المدخلة: $value”); }, )
- في تطبيقات Flutter، يتم التعامل مع إدخال المستخدم عبر Widgets مثل
- حزمة
dart:io
غير متاحة في تطبيقات الويب:- مكتبة
dart:io
تعمل فقط في تطبيقات Console أو Flutter (غير ويب).
- مكتبة
- التحقق من القيم الفارغة (
null
):- استخدم
??
أوif null
للتعامل مع القيم الفارغة:dartCopyString name = stdin.readLineSync() ?? “مجهول”;
- استخدم
مثال شامل:
dart
Copy
import 'dart:io'; void main() { print("==== تسجيل الدخول ===="); String? email; String? password; // إدخال البريد الإلكتروني while (email == null) { print("أدخل بريدك الإلكتروني:"); email = stdin.readLineSync(); if (email == null || !email.contains("@")) { print("بريد إلكتروني غير صحيح!"); email = null; } } // إدخال كلمة المرور while (password == null || password.length < 6) { print("أدخل كلمة المرور (6 أحرف على الأقل):"); password = stdin.readLineSync(); if (password == null || password.length < 6) { print("كلمة المرور قصيرة!"); } } print("تم التسجيل بنجاح!"); print("البريد: $email"); print("كلمة المرور: ${'*' * password.length}"); }
الناتج:
Copy
==== تسجيل الدخول ==== أدخل بريدك الإلكتروني: user بريد إلكتروني غير صحيح! أدخل بريدك الإلكتروني: [email protected] أدخل كلمة المرور (6 أحرف على الأقل): 123 كلمة المرور قصيرة! أدخل كلمة المرور (6 أحرف على الأقل): 123456 تم التسجيل بنجاح! البريد: [email protected] كلمة المرور: ******