UserInput

في لغة 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("صيغة خاطئة!");
  }
}

ملاحظات مهمة:

  1. الاستخدام في تطبيقات Flutter:
    • في تطبيقات Flutter، يتم التعامل مع إدخال المستخدم عبر Widgets مثل TextField، وليس عبر dart:io.
    • مثال:dartCopyTextField( decoration: InputDecoration(labelText: “أدخل اسمك”), onChanged: (value) { print(“القيمة المدخلة: $value”); }, )
  2. حزمة dart:io غير متاحة في تطبيقات الويب:
    • مكتبة dart:io تعمل فقط في تطبيقات Console أو Flutter (غير ويب).
  3. التحقق من القيم الفارغة (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]
كلمة المرور: ******