اذهب إلى المحتوى

Wael Aljamal

الأعضاء
  • المساهمات

    6975
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    218

إجابات الأسئلة

  1. إجابة Wael Aljamal سؤال في البرمجة غرضية التوجه OOP في البايثون كانت الإجابة المقبولة   
    لتعريف متغير يتم إسناد قيمة استدعاء دالة من غرض إليه تتم بالشكل التالي ضمن الصنف:
    نقوم بحساب المعدل ضمن الدالة مثلا و إسنادها للخاصية الموافقة:
    class child(parent): Gpa def calculate_gpa(self): self.Gpa = (حساب المتوسط) return self.Gpa وإن كنت تريد تخزينه في متغير خارج الصنف لاستعماله ضمن البرنامج:
    # تعريف غرض من الصنف c = child("xxx", "yyy") myGpa = c.calculate_gpa()  
  2. إجابة Wael Aljamal سؤال في كيف أقوم بإستدعاء دالة موجودة في صنف معين في بايثون حيث يكون اسمها موجود كنص كانت الإجابة المقبولة   
    يتم استدعاء دالة عن طريق استخدام متحول نصي يحوي الاسم كالتالي:
    getattr يقوم بإعادة (method | attribute) من الصنف المستدعاة عليه
    نقوم بتنفيذ الدالة المعادة
    # تضمين الصنف import foo # جلب الدالة bar = 'bar' method_bar = getattr(foo, bar) # الاستدعاء result = method_bar() ويمكن تنفيذها مباشرة كالتالي:
    result = getattr(foo, 'bar')() وأيضا يمكننا باستخدام الدالتين حسب scope:
    locals()["bar"]() globals()["bar"]()  
  3. إجابة Wael Aljamal سؤال في ترتيب قائمة بإستخدام طريقة Natural sort order في بايثون كانت الإجابة المقبولة   
    يمكننا استخدام المكتبة natsort المطلوبة فهي تقوم باستخدام الفرز الطبيعي لترتيب العناصر.
    # تضمين المكتة from natsort import natsorted, ns # تعريف المصفوفة x = ['Item10', 'item2', 'Item9', 'item3'] # استدعاء الدالة x = natsorted(x, key=lambda k: k.lower()) #1 # طباعة النتيجة print(x) # ['item2', 'item3', 'Item9', 'Item10'] ######################################### natsorted(x, alg=ns.IGNORECASE) #2 إما نقوم بتحويل جميع الحروف للشكل الصغير lower case أو نمرر وسيط لتجاهل حالة الأحرف:
    ربما تحتاج لتثبيت المكتبة:
    pip install natsort  
  4. إجابة Wael Aljamal سؤال في ضبط التأخير الزمني في برمجة Arduino - delay كانت الإجابة المقبولة   
    إن الدالة delay تستقبل المدة محددة ب milliseconds وكل ثانية تحوي 1000 ميلي ثانية.
    لذلك ليكون الوقت المحدد 40 ثانية يجب عمل التعديل الرياضي 40*1000 = 40,000 :
    #include <Servo.h> Servo myservo; Servo yservo; int pos = 0; void setup() { // initialize the LED pin as an output: pinMode(1, INPUT); pinMode(2, INPUT); myservo.attach(9); yservo.attach(10); } void loop() { int sensorvalue1 = digitalRead(1); int sensorvalue2 = digitalRead(2); if (sensorvalue1 == 0) { for(pos = 0; pos <90; pos +=5) { myservo.write(pos); yservo.write(pos); delay(40*1000); break ; } } if (sensorvalue2 == 0) { for(pos = 90; pos>0; pos -=5) { myservo.write(pos); yservo.write(pos); delay(40*1000); break; } } }  
  5. إجابة Wael Aljamal سؤال في إستدعاء ملف Python من خلال مسار الملف كانت الإجابة المقبولة   
    يمكننا استخدام المكتبة importlib بالشكل التالي:
    # تعريف المسار MODULE_PATH = "/path/to/your/module/__init__.py" # تحديد اسم ال module MODULE_NAME = "mymodule" # تضمين import importlib import sys # تحميل الملف spec = importlib.util.spec_from_file_location(MODULE_NAME, MODULE_PATH) # بناء النمذج module = importlib.util.module_from_spec(spec) # إضافته للبيئة sys.modules[spec.name] = module #تنفيذ spec.loader.exec_module(module)  
  6. إجابة Wael Aljamal سؤال في FMC احدث اصدار من Flutter كانت الإجابة المقبولة   
    بالنسبة لتشغيل الإشعارات في وضع تشغيل التطبيق أي بحالة Foreground Notifications يوجد طريقة مختلفة لتشغيلها.
    لاحظ في الشيفرة لديك، قمت بعمل دالة للتعامل مع Background Notifications وهي:
    FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); أمالتشغيل الإشعارت بالواجهة تاكد من اتباع التوثيق: notifications/#foreground-notifications
    حيث يعمل على الدالة:
    setForegroundNotificationPresentationOptions مثال المكتبة: firebase_messaging/example من التوثيق.
    مثال منشور على gitHub يمكنك تجربته و التأكد من ذلك: firebase_messaging/example.
    في حال وجدت حلاً للمشكلة أرجو مشاركته ليستفاد الآخرون وشكرا لك
    تعديل، أرجو مشاركة نوع نظام التشغيل الذي تعمل عليه لاختلاف المشاكل بين أندرويد و IOS مثالا اختلاف طريقة الوصول للإشعارت في أندرويد:
    ["notification"]["title"] في IOS:
    ["aps"]["alert"]["title"]. _____
    حل آخر كان بسبب عدم تحديد أيقونة التطبيق في:
    android drawable file contains the launcher_icon وجود أيقونة  استعراض الإشعار لتعمل في الواجهة الأمامية
  7. إجابة Wael Aljamal سؤال في صلاحيات fcm في flutter كانت الإجابة المقبولة   
    هل قمت بإلغاء تثبيت التطبيق وفتحه و عملت FCM بدون طلب إذن المستخدم؟
    لقد تم استبدال بعض الدوال من المكتبة و أصبحت deprecated يمكنك التأكد من
    الرابط: firebase.messaging.Messaging#requestpermission
    الصلاحيات: messaging/permissions
  8. إجابة Wael Aljamal سؤال في كيف نتعامل مع التسلسل Serialization في لغة جافا java كانت الإجابة المقبولة   
    Serialization: التسلسل هو عملية ترجمة بنية بيانات أو حالة كائن إلى تنسيق يمكن تخزينه أو نقله وإعادة بنائه لاحقًا.
    في جافا يمكننا تحويل أي بنية معطيات لسلسلة من البايتات، ممت يمكننا من لإرسال البيانات ضمن قنوات الاتصال عبر الشبكة أو تخزين ونقل المعطيات، ونرسلها لحاسوب آخر ثم نقوم بعكس العملية للحصول على البيانات الأصلية.
    يستعمل التسلسل عادة مع الأغراض لنقل بياناتها.
    طريقة البرمجة، على صنف الغرض الذي نريد عمل Serialization له أن يحقق الواجهة Serializable:
    class Muclass implements Serializable { ... } وتضمين المكتبة:
    import java.io.Serializable; والمكتبتبني التاليتين مثلا في حال أردنا كتابة الغرض في ملف:
    import java.io.ObjectInputStream; import java.io.ObjectOutputStream; ومثال على دالة تقوم بعمل Serialization وتكتب البيانات في ملف:
    private static void writeObject(Serializable shoe) throws IOException { ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream(new File("obj.ser"))); oos.writeObject(shoe); oos.close(); } ولقراءة الغرض:
    private static Object readObject() throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream( new FileInputStream(new File("obj.ser"))); Object obj = ois.readObject(); return obj; } مثال كامل من توثيق w3resources: w3resource.com/java-serialization.
    ليكن لدينا صنف عامل يحقق الواجهة:Serializable
    public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } } ولدينا الصنف التالي الذي قوم باختبار عمل السلسلة للكائن من الصنف السابق:
    import java.io.*; public class MySerialize { public static void main(String [] args) { Employee e = new Employee(); e.name = "my name"; e.address = "syria, damascus"; e.SSN = 1; e.number = 100; try { FileOutputStream fileOut = new FileOutputStream("/serilas/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in serilas/employee.ser"); } catch (IOException i) { i.printStackTrace(); } } } ولإعادة البيانات من الملف نعمل De-serialize:
    import java.io.*; public class MyDeserialize { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/serilas/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); } catch (IOException i) { i.printStackTrace(); return; } catch (ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } }  

     
  9. إجابة Wael Aljamal سؤال في استخراج نص من سلسلة نصية باستخدام التعابير المنتظمة بلغة البايثون كانت الإجابة المقبولة   
    بما أن الرقم الوطني له خصائصص يمكننا بناء التعبير المنتظم وفقها مثلا:
    مثال للبحث عن نص ثابت و محدد:
    expr = '056' ثم وضعها هكذا:
    import re text = 'Hello my Jawwal number is 056' expr = '056' match = re.findall(expr, text) print(match) # => ['056'] الآن حاولي تعديل الشيفرة، حيث سنعمل على جعل القسم الآخر من الرقم الوطني عبارة عن أرقام بعدد محدد:
    [0-9]* # عدد لانهائي من الأرقام وممكن 0 [0-9]+ # عدد لانهائي من الأرقام ولكن على الأقل رقم واحد [0-9]X # X عدد لانهائي من الأرقام وعددهم [0-9]2 [0-9]7 [0-9]X... حاولي دمج القسم الثابت و يتبعه القسم المتغير والمحاولة.
    علما أن:
    [0-9] # ستعطي رقم واحد ضمن المجال  
  10. إجابة Wael Aljamal سؤال في خطأ AttributeError: module 'requests' has no attribute 'get' في بايثون كانت الإجابة المقبولة   
    تحدث مشكلة circular import عندما تتضارب الاعتماديات، أي وجود ملف لدينا في مشروعنا بنفس اسم المكتبة لذلك لحل المشكلة أرجو تغيير اسم الملف requests لديك.
    يمكنك التأكد من الملف المضمن بتنفيذ الشيفرة:
    print dir(requests) في حال أن الاستدعاء يعمل مع المكتبة requests وليس الملف الخاص بمشروعك، سيظهر التالي:
    ['ConnectionError', 'HTTPError', 'Request', 'RequestException', 'Response', 'Session', 'Timeout', 'TooManyRedirects', 'URLRequired', '__author__', '__build__', '__builtins__', '__copyright__', '__doc__', '__file__', '__license__', '__name__', '__package__', '__path__', '__title__', '__version__', '_oauth', 'api', 'auth', 'certs', 'codes', 'compat', 'cookies', 'defaults', 'delete', 'exceptions', 'get', 'head', 'hooks', 'models', 'options', 'packages', 'patch', 'post', 'put', 'request', 'safe_mode', 'session', 'sessions', 'status_codes', 'structures', 'utils'] جميع دوال المكتبة.
    ___________________
    عند التضمين باستخدام:
    import requests نستعمل requests.get أما:
    from requests import * نستعمل get لأنه تم تضمين جميع فضاء العيبنة في الطريقة الثانية فيمكن استخدام get مباشرة.
  11. إجابة Wael Aljamal سؤال في مشكلة في المعامل is مع الأرقام أكبر من 256 في بايثون كانت الإجابة المقبولة   
    سبب هذا أن is تتأكد أن طرفي المقارنة يشيران لنفس الغرض في الذاكرة وإن بايثون لتحسين الأداء تقوم بعمل
     caches integer objects للأعداد الصحيحة الصغيرة:
    -5 .. 256 معتمدةً على نموذج التصميم singleton أي جميع الأعداد الصحيحة ضمن ذلك المجال التي لها نفس القيمة ستشير لنفس الغرص فيكون نتيجة تقييم is تعطي true أما في الأعداد الكبيرة ستقوم بايثون بتوليد غرض مستقل لكل متغير/قيمة.
  12. إجابة Wael Aljamal سؤال في طباعة عنصر في قوائم متداخلة في بايثون كانت الإجابة المقبولة   
    يمكننا المرور على القوائم بالطريقة التراجعية وهي خوارزيمة تقوم على استدعاء نفسها عدة مرات، حيث لكل عنصر سوف نختبر هل هو عنصر وحيد؟ إن كان عنصر وحيد نضيفه للقائمة النهائية (خرج الخوارزمية) وإن كان قائمة نقوم باستدعاء عودي/تراجعي لهذه القامة الفرعية:
    def flatten(nested_list): if len(nested_list) == 0: return nested_list if isinstance(nested_list[0], list): return flatten(nested_list[0]) + flatten(nested_list[1:]) return nested_list[:1] + flatten(nested_list[1:]) print(flatten([[1, 2, 3, 4], [5, 6, 7], [8, 9], 10])) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] isinstance يختبر هل الوسيط الأول من النوع المساوي للوسيط الثاني وعليه نحدد هل العنصر الحالي هو قائمة أو لا.
  13. إجابة Wael Aljamal سؤال في كيفية عمل متغير من نص في بايثون؟ كانت الإجابة المقبولة   
    يمكن ذلك من خلال الدالة vars:
    a = 'spam' vars()[a] = 123 print(spam) # 123 أو global:
    globals()['somevar'] = 'someval'  
    في المثال الأول يتم تعويض اسم المتحول a كنص ويتم بناء متغير بهذا الاسم و اسناد القيمة له أي نفس المثال الثاني باستخدام global.
  14. إجابة Wael Aljamal سؤال في كل القوائم تتغير معًا في بايثون كانت الإجابة المقبولة   
    إن السبب في هذه النتيجة أن عملية الضرب بعد تشكيل المصفوفة تقوم بتكرار القيمة لنفس الكائن (المصفوفة المكونة من 5 أصفار) وتأخذه بالمرجع بآلية shallow lists.
    حيث: في القائمة الأولى لا تُنشئ بايثون 5 كائنات أعداد صحيحة ولكنها تنشئ فقط كائنًا صحيحًا واحدًا وكل مؤشرات المصفوفة تشير إلى كائن int نفسه كما هو موضح في الرسم المرفق و النتيجة في المثال.
    بعد تغيير قيمة أحد هذه الأغراض سوف يتم إنشاء غرض منفصل له فقط، وبما أنه كل غرض من الأغراض الخمسة مكرر في 3 قوائم بالمرجع/بالعنوان، سوف يتم تغيير نفس القيمة للعنصر المقابل في جميعهم.
    والحل هو إنشاء كل سطر في المصفوفة على حدى:
    arr = [[0 for i in range(5)] for j in range(3)] [0][0] = 1 print(arr) [[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] صورة توضيحية:

    في الحالة الأولى عند طباعة عناوين الذاكرة لكل مصفوفة ستكون تشير لنفس العنوان:
    Arr = [[0] * 5] * 3 Arr[0][0] = 1 print(Arr) print (id(Arr[0])) print (id(Arr[1])) print (id(Arr[2])) #1221247140608 #1221247140608 #1221247140608  
  15. إجابة Wael Aljamal سؤال في كيفية التحقق من قيمة العديد من المتغيرات في نفس الوقت في بايثون؟ كانت الإجابة المقبولة   
    يمكننا عمل هذه الطريقة:
    if 0 in {x, y, z}: ستقوم بعمل set للمتغيرات 
    <class 'set'> الحل بشكل عملي هو تعريف دالة تقوم بإرجاع مجموعة من المتغيرات خلال عمل البرنامج (أي تقرأ القيم الحديثة للمتغيرات) 
    وبهذا تصبح تعيد مجموعة ديناميكية أي تصلح حتى مع تغيير قيم المتغيرات مع عمل البرنامج لسبب بنائها عند الحاجة.
    x = 1 y = 2 z = 0 def w(): return {x, y, z} if 0 in w(): # trur print('hi0') z = 5 if 0 in w(): # false print('hi1') كما يمكننا ببساطة عمل دالة تحوي على الشرط السابق واستدعائها
    def at_least_one_zero(): If x==0 or y == 0 or z == 0: print('hello, world')  
  16. إجابة Wael Aljamal سؤال في سؤال في jQuery - حذف مدخل من الداتابيز كانت الإجابة المقبولة   
    هل يمكنك تعديل بادئة الصفحة لتصبح بالشكل التالي:
    <?php  
  17. إجابة Wael Aljamal سؤال في ال test الذى قمت بعمله نجح كله ماعدا شئ واحد كانت الإجابة المقبولة   
    في termial ضمن vs code يوجد قائمة منسدلة في الجزء الأيمن تحوي على كل برامج الطرف الثالث التي تعمل مثل cmd - powershell وغرها.
    وجود أحدهم يعمل بنفس المنفذ /مثلا نسخة من برنامجك/ بدون إغلاقه يؤدي لهذه المشكلة التي تفيد بأن المنفذ port مستخدم، ربما سببها أيضا انك لم تغلق البرنامج الخاص بالاختبار من تجربة سابقة.أرجو محاولة إغلاقهم جميعا.
    حاول تشغيل الاختبار على منفذ 3001 مثلا.
  18. إجابة Wael Aljamal سؤال في كيفية عمل عمليتين في وقت واحد في mysql كانت الإجابة المقبولة   
    يمكننا معرفة المعرف الخاص بآخر عملية إضافة في MySQL باستخدام PHP كالتالي:
    عن طريق غرض الاتصال، حيث يحوي حقلا فيه قيمة المعرف المطلوب:
    $last_id = $conn->insert_id; وكمثال كامل للحشو و الاستعلام عن المعرف إليك الشيفرة البسيطة التالية:
    MySQLi Object-oriented
    <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if ($conn->query($sql) === TRUE) { $last_id = $conn->insert_id; echo "New record created successfully. Last inserted ID is: " . $last_id; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?> أو إن كنت لا تستخدم البرمجة غرضية التوجه:  MySQLi Procedural
    <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if (mysqli_query($conn, $sql)) { $last_id = mysqli_insert_id($conn); echo "New record created successfully. Last inserted ID is: " . $last_id; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?>  
  19. إجابة Wael Aljamal سؤال في مشكلة تكرار الملفات المرفوعه في قاعدة البيانات flutter كانت الإجابة المقبولة   
    سنعمل على حساب عدد الصور التي تم تحديدها، أي استدعاء الدالة _onAddImageClick حسب فهمي للشيفرة فاستدعائها يتكرر مع كل تحديد للصورة.
    يمكنك تعريف متغير قبل الدالة، وعلينا زيادته ب 1 بعد كل استدعاء أي:
    var _imageCounter = 0; ^^^^^^^^^^^^^^^^^^ Future _onAddImageClick(int index, int type) async { if (images != null) setState(() { _imageCounter ++; ______^^^^^^^^^^^^^^^^ // ignore: deprecated_member_use _imageFile = ImagePicker.pickImage( source: type == 1 ? ImageSource.camera : ImageSource.gallery, imageQuality: 50, ); getFileImage(index); }); } وفي الحلقة:
    for(int i=0;i < _imageCounter ;i++) ^ ^^^^^^^^^^^^^ أصغر تماما لكي لا نجلب صورة إضافية
  20. إجابة Wael Aljamal سؤال في حفظ ملف إلى مجلد Download باستخدام android studio واللغة java كانت الإجابة المقبولة   
    يوجد متغير في بيئة أندرويد يشير مباشرة لمجلد التحميل Downloads :
    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); حيث يتم جلبه من متغيرات البيئة Environment. حيث نمرر هذه القيمة للدالة getExternalStoragePublicDirectory المسؤولة عن جلب مسار المجلدات الخارجية العامة.
    طبعا لا تنسى إعطاءسماحية الوصول:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> في Android Mainfest.
    مسار تخزين الملف:
    final String relativeLocation = Environment.DIRECTORY_DOWNLOADS + File.separator + “YourSubforderName”; للتأكد من المسار يمكنك طباعة القيمة التالية (مثلا في Toast أو log)
    File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); dir.getAbsolutePath()  
  21. إجابة Wael Aljamal سؤال في تغيير مباشر لل TextView كانت الإجابة المقبولة   
    يمكننا إضافة TextWatcher للحقل edit text عن طريق الدالة afterTextChanged التي تنفذ حدثا ما بعد التوقف عن الكتابة:
    يمكنك الاستفادة من الشيفرة التالية:
    TextWatcher inputTextWatcher = new TextWatcher() { public void afterTextChanged(Editable s) { textview.setText(s.toString()); // تعديل عنصر العرض المستهدف } }; editText.addTextChangedListener(inputTextWatcher); // جعل مستقل حدث التغيير مرتبط مع حقل الإدخال إذا أردت تغييرات لحظية استبدال الدالة after text change بالدالة  onTextChage:
    TextWatcher inputTextWatcher = new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { textview.setText(s); //... } }; editText.addTextChangedListener(inputTextWatcher); توثيق: android/text/TextWatcher
  22. إجابة Wael Aljamal سؤال في عدم عمل لعبة الثعبان في بايثون كانت الإجابة المقبولة   
    يوجد شيفرة مضافة في هذا السطر (شيفرة تشغيل البرنامج) يمكنك حذفها لأنها ليست جزء منه.
    يمكنك تشغيل المشروع في cmd وهو يعمل :
     

  23. إجابة Wael Aljamal سؤال في تصنيف نقاط البيانات بناءً على قيم عمود محدد باستخدام Pandas في بايثون كانت الإجابة المقبولة   
    يمكننا تعريف حقل جديد C بالخصائص التالية:
    df['c'] = pd.Categorical.from_array(df.b).labels حيث سيأخذ قيمة أسماء عناصر b ويعمل منهم تصنيف:
    absent -> 0 no -> 1 yes -> 2 نلاحظ أنهم بترتيب أبجدي.
  24. إجابة Wael Aljamal سؤال في تحميل برنامج الاليستريتور كانت الإجابة المقبولة   
    يمكنك تجريب النسخة من هذا الموقع: Adobe Illustrator . 64 bit Version: 2021 v25.0.1.66
  25. إجابة Wael Aljamal سؤال في مشاركة صفحة flutter مع تطبيقات مختلفة كانت الإجابة المقبولة   
    بالنسبة لهذا الجزئية بالتحديد، أعتقد أنك تقصد تقنية Deep Link حيث يتم وضع رابط ما في موقع الكتروني أو إعلان و عند النقر عليه يتم فتح التطبيق على الصفحة المختارة مسبقا، أو التوجه للمتجر play store. للأسف أنا لم استخدمها مسبقا ولكن يمكنك مراجعة التوثيق من الصفحة الرسمية: flutter.dev deep-linking.
    وباستعمال مكتبة uni_links يمكن استقبال حدث الوجيه (المشاركة) ومن ثم فتح الصفحة المناسبة.
    يمكنك البحث أكثر من:
    How to handle deep-linking to a Flutter App
    Deep Links and Flutter applications. How to handle them properly.
×
×
  • أضف...