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

Flutter Dev

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

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

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

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

    2

أجوبة بواسطة Flutter Dev

  1. بتاريخ 3 دقائق مضت قال Wael Aljamal:

    أحد الحلول هي كالتالي:

    
    TARGETS -> select[your project name] ->
    	General -> Frameworks,Libraries,and EmbeddedContent 
    				-> set the framework with [Do Not Embed]

    لكي لايتم تضمين static frameworks حسب موقع آبل، فلاتر تعمل مع dynamic frameworks 

    • static frameworks يتم تضمينهم في المرحلةالنهائية من تجميع التطبيق

    اهلا بك اخي 

    قمت بتجربة هذا الخيار وهو بالاساس متوفر لدي من قبل وعلى وضع Do not embed 

    ولم ينجح 

    • أعجبني 1
  2. تحيه طيبه للجميع

    احاول تشغيل تطبيق flutter - ios من خلال xcode  ولكن الامر لا ينجح في كل مره احصل على الرسالة التاليه او الخطاء :

    Unable to install "Runner"
    
    The code signature version is no longer supported.
    

    ظهرت هذا المشكله لدي بعد تحديث هاتفي الايفون الى الاصدار ios 15  مع العلم انني قمت بتجربة تشغيل  التطبيق على هاتف ايفون ios14 وهو يعمل بشكل جيد.

    هل يعلم احدكم سبب حدوث هذا المشكله وكيف يمكن حلها؟

     

    • أعجبني 1
  3. بتاريخ منذ ساعة مضت قال بلال زيادة:

    حاول التغيير بالخصائص المدرجة في GridView كما في الشكل التالي 

    
    return GridView.builder(
            controller: _scrollController,
            scrollDirection: Axis.vertical,
            gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
                maxCrossAxisExtent: 200,
                childAspectRatio: 1 / 2,
                crossAxisSpacing: 10,
                mainAxisSpacing: 20),
            itemCount: products.length,
            itemBuilder: (context, index) {
              return Card();
    });

    لذلك يوجد هذه الخصائص 

    
    maxCrossAxisExtent: 200,
    childAspectRatio: 1 / 2,
    crossAxisSpacing: 10,
    mainAxisSpacing: 20

    بحيث يمكن التلاعب بطول و عرض GridView و ايضا كيفية امتداها بشكل طولي أو عرضي.

    اهلا بيك اخوي 

    اشكرك على اقتراحك ولكن ليس هذا الطريقه التي ابحث عنها هذا الطريقة العاديه هذا سبب المشكله انا ارغب بحلها

    • أعجبني 1
  4. تحيه طيبه للجميع

    كيف يمكن تحديد ارتفاع وعرض GridView بشكل تلقائي بدون ان اضع قيم انا ثابته اعتمادنا على شاشة الهاتف مقاساتها.

    اواجه مشكله انني قمت بتحديد القيم لشاشه هاتف اقوم بالاختبار عليها ولكن المشكله بعد تشغيل التطبيق على هاتف مساحة شاشته مختلفه العناصر صارت مثل الذي تضعها في خانه اكبر منها 

    على سبيل المثال لدي صوره واسفل منها اسم الصوره في الهاتف الجديد النص اصبح مختفي ولو رغبة ان يظهر اقوم بتمرير تلك الصوره الى الاعلى وبعدها يظهر النص من الاسفل بمعنى الخانه اصبحت اصغر والعناصر التي بداخلها اصبحت تتحرك بها 

     

    هل يوجد حل لتحديد الارتفاع والعرض بشكل تلقائي لحل هذا المشكله؟

     

    مع العلم انني يكت بالاتطلاع على المكتبه التاليه 

    https://pub.dev/packages/flutter_staggered_grid_view#-readme-tab-

    ولكني لا ارغب بستعمالها لنها تقوم بعرض بعض العناصر اطول والبعض اقصر وانا ارغب ان يكونن متساويات ف الطول 

    • أعجبني 1
  5. تحيه طيبه للجميع 

    لدي شريط bottomNavigationBar يعرض صفحات مختلفه من خلال احد الصفحات فيه اقوم بالانتقال الى صفحه مختلفه بواسطة الامر التالي:

    Navigator.push(
            context,
            MaterialPageRoute(
                builder: (context) => Page2()),
          );

     

    ولكن مشكلتي لو قمت الان من خلال الصفحة page2  بالعوده الى الصفحة الاولى التي سبق وقمت بالانتقال منها يتم عرض الصفحه الاولى ولكن بدون شريط bottomNavigationBar ايضا انا اقوم بالعوده لها من خلال الامر التالي:

    Navigator.push(
            context,
            MaterialPageRoute(
                builder: (context) => Page1()),
          );

     

    هل يوجد حل لهذا المشكله ام طريقة مختلفه لتجنب هذ المشكلة؟ كيف يمكن الوصول الى الصفحه الاولى في شريط bottomNavigationBar

    • أعجبني 1
  6. بتاريخ 2 دقائق مضت قال Wael Aljamal:

    تختلف عملية استنساخ التطبيق حسب مصنع هاتف أندرويد، توجه للضبط setting ثم ابحث عن أحد هذه التسيمات

    
     Dual apps, App Clone, App twin, or Parallel Apps

    وهذهمدعومة من نظام التشغيل مباشرة، وسوف تعمل على استنساخ التطبيق وتنصيبه بدون مشاكل.

    مع الاسف اخي ان هذا الخاصية فقط تدعم الواتساب العادي وليست نسخة الاعمال  سبق وقمت بتجربتها

  7. بتاريخ الآن قال Wael Aljamal:

    لعمل نسخة مختلفة من تطيق ما، عليك تحميل التطبيق ثم استخدام مفاهيم و أدوات الهندسة العكسية لاسرتاج الشيفرة المصدرية الأصلية له، وهنا بعد عمل تلك الخطوة، سيصبح لديك نسخة المطور من المشروع، حيث يمكنك تعديل اسم الحزمة و عمل التغييرات التي تريدها، "لكن هذا أمر غير قانوني"

    هل تقصد تشغيل نسختين من التطبيق مثل dual messenger على نفس الجهاز.. هذا سببه عدم دعم التطبيق لهذا الأمر على عكس تطبيق facebook messenger وغيره، ربما تستطيع توضيح هذه الجزئية من فضلك؟

    اهلا بك اخي الكريم شاكر لك ردك

    نعم انا لدي مشكله انني محتاج استعمل تطبيق الواتساب اعمال مرتين في جهازي ولكني لا ارغب بستعماله عن طريق البرامج الذي تعمل فضاء مختلف وما شابه لنسخ التطبيق ارحتاج نسخه اعمل لها تنصيب وتكون بين التطبيقات العاديه حالها من حال اي تطبيق

  8. بتاريخ On 9/22/2021 at 11:52 قال بلال زيادة:

    يجب عليك وضع زر عودة في leading أو actions في appbar ثم تعطيه أمر عند الضغط بأن يعود إلى صفحة A بهذا الشكل 

    
    appBar: AppBar(
            actions: [
              IconButton(
                icon: Icon(Icons.back),
                onPressed: () {
                  Navigator.pushNamed(context, '/a');
                },
              ),
            ],
          ),

     

    هلا بيك اخي 

    ساقوم بتجربه باذن الله حقيقه انني اشاهد هذا الطريقة منذ فتره ولكن لم يسبق لي تجربتها 

    ماذا تفرق هذا الطريقه اخوي عن طريقه المعتاده؟

    كل الشكر لك اخي الكريم 

    • أعجبني 1
  9. لدي استفسار لو تكرمتو

    اواجه مشكله في بعض الصفحات الصفحات التي تنتقل وفيها اجراء 

    على سبيل المثال 

    لدي صفحه A انتقل منها الى صفحه B ثم الى صفحه C وهيا صفحه تعديل البيانات 

    اقوم بتعديل البيانات بداخلها ثم اضغط حفظ ف يقوم زر الحفظ بحفظ البيانات وايضا يوجد امر انتقال وعوده الى صفحه B

    الان المستخدم في الصفحه B تحدث المشكله هنا لو قمت بضغط على زر row back في شريط appbar يعود بي الى  صفحه C وهذا غلط من المفترض ان يعود الى صفحه A 

    كيف يمكن حل هذا نوع من مشاكل الانتقال في Flutter 

    لا اعلم حقيقه اذا كانت المشكله واضحه حسب ما قمت بشرحها

    • أعجبني 1
  10. لدي جهازي يعمل بنظام تشغيل اندرويد وارغب بعمل نسخه من برنامج واتساب اعمال 

    كيف الطريقه لفعل ذلك؟انا اشوف الكثير يعمل له نسخه من الواتساب ويقوم باضافات وتغير الايقونه والاسم وغيره

    هل توجد طريقة محدده لفعل ذلك؟

    مع العلم ان نظام المراسل المزدوج لا يمكن من خلال نسخ تطبيق واتساب اعمال 

     

    • أعجبني 1
  11. بتاريخ 20 دقائق مضت قال Wael Aljamal:

    سنحاول تحديد المحارف الممكنة من خلال التعابير المنتظمة حسب مجال المحارف الانكليزية للأرقام.. حيث نمرر RegExp والتي هي اختصار ل regular expression من خلال الدالة allow

    
    TextField(
     inputFormatters: <TextInputFormatter>[
          FilteringTextInputFormatter.allow(RegExp("[0-9]")),
      ], // Only numbers can be entered
    ),

    أما مثلا حروف وأرقام انكليزية يمكن التالي:

    
    FilteringTextInputFormatter.allow(RegExp("[0-9a-zA-Z]")),

    وإن أردت السماح بافراغات فقط أضف فراغ 

    
    "[a-zA-Z ]"
           ^^^

     

    كل الشكر لك اخي الطريقة فعالة

    هل يمكن عن طريقها دمج الاحرف العربية+ الارقام الانجليزية بحيث نستبعد الارقام العربية؟

    ايضا هل يمكن ان نضع لها تنبيه او مسج مثلا غير مسموح استعمل هذا الارقام؟

  12. تحيه طيبه للجميع

    لدي استفسار لو تكرمتو

    اقوم بستعمال TextFormField لتعبئة الارقام ولكن واجهتني مشكله مع نظام ios حيث ان المستخدم قادر على ادخال الارقام باللغة العربية وانا فقط ارغب ان يستقبل  الحقل الارقام الانجليزية . في نظام ال ios  يمكن للمستخدم تغيير الكيبورد من اسفل الكيبورد من انجليزي الى عربي والعكس ايضا.

    هل يوجد حل لجعل المستخدم فقط يقوم بادخال الارقام الانجليزية في الحقل؟

    مع العلم انني قمت بتجربة :

      keyboardType: TextInputType.number,

     

     inputFormatters: <TextInputFormatter>[
        FilteringTextInputFormatter.digitsOnly
    ], 

    ولكن الكل يمنح المستخدم امكانية تغير الارقام من الانجليزية الى العربية 

    هل يوجد حل مختلف لمنع المستخدم من ادخال الارقام العربية ؟

    • أعجبني 1
  13. بتاريخ 18 ساعات قال Wael Aljamal:

    إن حفظ رقم الهاتف في قاعدة البيانات يمنع تكراره لمستخدم آخر إن كان هذا الأمر يهمك.

    ضمن دالة verified Success قم بتغيير الشيفرة المسؤولة عن إعادة تسجيل الدخول التلقائي التي ستتم مجدداً عن طريق الرقم، أي فقط دع جزء حفظ الرقم في قاعدة البيانات، وللتحقق لاحقاً من تسجيل هذا المستخدم وأنه قد عمل تحقق لرقم الهاتف، حينها يتوجب عليك فقط التأكد هل هذا المستخدم لديه رقم هاتف أم لا (متحقق منه أم لا) إن كان لديه رقم هاتف فهوم قد عمل تحقق وإلا لا يتحقق من رقمه.

    أي بالمختصر لا تقم باستدعاء أي شيفرة مسؤولة عن تسجيل الدخول لأنها تؤدي لتشكيل id جديد وأنت لاتحتاجه

    أعتقد لديك بعد التحقق من رقم الهاتف، يتم تسجيل الخروج من الحساب الحالي، وتسجيل الدخول بحساب جديد للرقم المتحقق منه

    
    verificationCompleted: verifiedSuccess,

    verifiedSuccess هي الدالة التي تستدعيها عند اكتمال التحقق لأن الشيفرة التابعة لها تقوم بتسجيل الدخول و دالة تسجيل الدخول ستكون بهذا الشكل / الاسم 

    
    signInWithPhoneAuthCredential(credential);
    
    FirebaseAuth auth = FirebaseAuth.instance;
    
    await auth.verifyPhoneNumber(
      phoneNumber: '+44 7123 123 456',
      verificationCompleted: (PhoneAuthCredential credential) async {
    
        await auth.signInWithCredential(credential);       // لانرديها
      },
    );

    توثيق: firebase.flutter.dev/docs/auth/phone

    حاولت تطبيقه هنا اخي هذا الكود الذي لدي قمت بتغيره وتعديل كثيرا ولكن لم ينجح الامر

    final FirebaseAuth _auth = FirebaseAuth.instance;
      void signInWithPhoneAuthCredential(PhoneAuthCredential phoneAuthCredential) async {
        setState(() {
          showLoading = true;
        });
    
        try {
          final authCredential = await _auth.signInWithCredential(phoneAuthCredential);
    
          setState(() {
            showLoading = false;
          });
    
          if (authCredential?.user != null) {
    
    print('Go to other page ok');
          }
        } on FirebaseAuthException catch (e) {
          setState(() {
            showLoading = false;
          });
          print(e.message);
        }
      }
    
    
      @override
      Widget build(BuildContext context) {
    
        return    MaterialApp(
        home: Scaffold(
          body: Center(
            child: SingleChildScrollView(
              child: Container(
                child: Column(
    
                  children: [
    
    
                    Container(
    
                      padding: const EdgeInsets.all(16.0),
    
                      child: Column(
    
                        children: [
    
                          Row(
                            children: [
                              Expanded(
                                child: PinEntryTextField(
    
                                  fields: 6,
                                  onSubmit: (text) {
                                    smsOTP = text as String;
                                  },
                                ),
                              ),
                            ],
                          ),
    
                          GestureDetector(
                            onTap: () {
                              verifyOtp();
                            },
                            child: Container(
                              margin: const EdgeInsets.all(8),
                              height: 45,
                              width: double.infinity,
                              decoration: BoxDecoration(
                                color:     CustomColors.Background,
                                borderRadius: BorderRadius.circular(0),
                              ),
                              alignment: Alignment.center,
                              child:  Text('Check'),
    
                            ),
                          ),
                        ],
                      ),
                    )
                  ],
                ),
              ),
            ),
          ),
        ),
        );
      }
    
    
      Future<void> generateOtp(String contact) async {
        final PhoneCodeSent smsOTPSent = (String verId, [int forceCodeResend]) {
          verificationId = verId;
        };
        try {
          await _auth.verifyPhoneNumber(
              phoneNumber: contact,
              codeAutoRetrievalTimeout: (String verId) {
                verificationId = verId;
              },
              codeSent: smsOTPSent,
              timeout: const Duration(seconds: 60),
              verificationCompleted: (AuthCredential phoneAuthCredential) {},
              verificationFailed: (exception) {
                print(exception);
    
              });
        } catch (e) {
          handleError(e as PlatformException);
    
        }
      }
    
      
      Future<void> verifyOtp() async {
        if (smsOTP == null || smsOTP == '') {
          print('please enter 6 digit otp');
          return;
        }
        try {
    
          final AuthCredential credential = PhoneAuthProvider.credential(
            verificationId: verificationId,
            smsCode: smsOTP,
          );
          signInWithPhoneAuthCredential(credential);
    
        } catch (e) {
          handleError(e as PlatformException);
        } }
    
      void handleError(PlatformException error) {
        switch (error.code) {
          case 'ERROR_INVALID_VERIFICATION_CODE':
            FocusScope.of(context).requestFocus(FocusNode());
            setState(() {
              errorMessage = 'Invalid Code';
            });
            print('error');
            break;
          default:
            print('error');
            break;
        }
      }
    }

     

  14. بتاريخ 13 ساعات قال Wael Aljamal:

    يمكن استخدام الحزمة sms_autofill لقراءة رسائل SMS بشكل تلقائي

    واستخدامها بالشكل:

    
    await SmsAutoFill().listenForCode;

    طبعا يوجد widget خاصة  PinFieldAutoFill :

    
    PinFieldAutoFill(
                    decoration: // التنسيق,
                    currentCode: // كود التحقق الحالي
                    onCodeSubmitted: //الكود المعاد إرساله
                    onCodeChanged: //code  callback عند
                    codeLength: // طول الكود
                  ),

    الرابط: pub.dev/packages/sms_autofill

    • لن تحتاج لهذه الحزمة في IOS
    • الوصول ل SMS لايحتاج صلاحيات

    بعض القيود لتحقيق عملية التحقق : developers.google.com/identity/sms-retriever/verify

    القيود: 

    1. طول الرسالة ليس أكثر من 140 bytes
    2. تحوي على كود فريد لمرة واحدة كمثال: 
      
      Your ExampleApp code is: 123ABC78

       

    3. تقوم بإرفاق 11-character hash string للتعريف بتطبيقك مثل 

      FA+9qCX9VSu

    الرابط السابق يحوي جميع التفاصيل

    حزمة احتياطية:

    اهلا بك اخي الكريم 

    شاكر لك ردك الغالي

    نعم انا قمت بتجربة هذا الحزمة وهيا شغاله ولكن المشكله التي لم افهم حلها بصراحه 

    هم يطلبون في كل رسالة ان يكون هنالك معرف التطبيق او كود مرفق في الرسالة مثل الذي انت قمت بوضعه : 

    1. FA+9qCX9VSu

     

    كيف ممكن ارفق هذا الكود لدى الرسالة التي تاتي من الفايربيز هذا الجزء الذي لم افهم العمل عليه 

    اما باقي الاجزاء وتشغيل الكود لتجربه كل شي ناجح 100%100

  15. بتاريخ 15 دقائق مضت قال Wael Aljamal:

    ماهي بيانات المستخدم التي تستعملها للتعرف عليه؟

    لم افهم سولك عدل اخوي ولكن انا مسبقا اقوم بعملية تسجيل الدخول بواسطة حساب جوجل بمعنى انا لدي توثيق سابقا وتم تخزين البيانات مسبقا والحصول على Uid للمستخدم 

    ولكن لاحقا اقوم بطلب استكمال بيانات المستخدم بحيث انني اقوم بطلب منه ادخال رقم هاتفه واقوم بتحقق منه هنا تحدث المشكله بحيث انني لا ارغب بتخزين رقم الهاتف انا سبق وقمت بتخزين الايميل وهذا كافي حتى لا احصل على معرفين Uid

    المشكله انني الان احصل على Uid مختلفين واحد لرقم الهاتف وثاني خاص ب الايميل

    • أعجبني 1
  16. اذا كنت ارغب بالحصول على رمز التفعيل من الفايربيز من خلال sms واتحقق ان رقم الهاتف صحيح ولكن بعد التحقق لا ارغب بتخزين او حفظ رقم الهاتف على الفايربيز في قائمة التوثيق او الحسابات التي تم توثيقها هل يمكن فعل ذلك؟

    بمعنى انا فقط،محتاج الى رسالة التفعيل والتحقق ولكن بدون حفظ للبيانات لدي هل يمكن فعل ذلك؟ اذا نعم ياليت شرح الطريقه 

    للغة البرمجة Flutter

  17. تحيه طيبه للجميع

    لدي كود لتسجيل الدخول بواسطة رقم الهاتف والتحقق من otp  المرسل من خلال sms  الى الهاتف من firebase الكود يعمل بشكل جيد ولكن المشكلة لا يتم تعبئة الرمز بعد وصوله الى الهاتف او وصول الرسالة النصية الى الهاتف بشكل تلقائي في حقول textfiled  

    ارغب بجعل القراءة تكون بشكل تلقائي بحيث ان المستخدم بعد ان يصل اليه الرمز يتم التحقق بشكل تلقائي وتعبئة الحقول  ياليت اذا احد يعرف الطريقة يساعدنا

    الكود المستعمل لدي كامل :

     final FirebaseAuth _auth = FirebaseAuth.instance;
      void signInWithPhoneAuthCredential(PhoneAuthCredential phoneAuthCredential) async {
        setState(() {
          showLoading = true;
        });
    
        try {
          final authCredential = await _auth.signInWithCredential(phoneAuthCredential);
    
          setState(() {
            showLoading = false;
          });
    
          if (authCredential?.user != null) {
    
    
          }
        } on FirebaseAuthException catch (e) {
          setState(() {
            showLoading = false;
          });
          print(e.message);
        }
      }
    
    
      @override
      Widget build(BuildContext context) {
    
        return    MaterialApp(
        home: Scaffold(
          body: Center(
            child: SingleChildScrollView(
              child: Container(
                child: Column(
    
                  children: [
    
    
                    Container(
    
                      padding: const EdgeInsets.all(16.0),
    
                      child: Column(
    
                        children: [
    
                          Row(
                            children: [
                              Expanded(
                                child: PinEntryTextField(
    
                                  fields: 6,
                                  onSubmit: (text) {
                                    smsOTP = text as String;
                                  },
                                ),
                              ),
                            ],
                          ),
    
                          GestureDetector(
                            onTap: () {
                              verifyOtp();
                            },
                            child: Container(
                              margin: const EdgeInsets.all(8),
                              height: 45,
                              width: double.infinity,
                              decoration: BoxDecoration(
                                color:     CustomColors.Background,
                                borderRadius: BorderRadius.circular(0),
                              ),
                              alignment: Alignment.center,
                              child:  Text('Check'),
    
                            ),
                          ),
                        ],
                      ),
                    )
                  ],
                ),
              ),
            ),
          ),
        ),
        );
      }
    
    
      Future<void> generateOtp(String contact) async {
        final PhoneCodeSent smsOTPSent = (String verId, [int forceCodeResend]) {
          verificationId = verId;
        };
        try {
          await _auth.verifyPhoneNumber(
              phoneNumber: contact,
              codeAutoRetrievalTimeout: (String verId) {
                verificationId = verId;
              },
              codeSent: smsOTPSent,
              timeout: const Duration(seconds: 60),
              verificationCompleted: (AuthCredential phoneAuthCredential) {},
              verificationFailed: (exception) {
                print(exception);
    
              });
        } catch (e) {
          handleError(e as PlatformException);
    
        }
      }
    
      
      Future<void> verifyOtp() async {
        if (smsOTP == null || smsOTP == '') {
          print('please enter 6 digit otp');
          return;
        }
        try {
    
          final AuthCredential credential = PhoneAuthProvider.credential(
            verificationId: verificationId,
            smsCode: smsOTP,
          );
          signInWithPhoneAuthCredential(credential);
    
        } catch (e) {
          handleError(e as PlatformException);
        } }
    
      void handleError(PlatformException error) {
        switch (error.code) {
          case 'ERROR_INVALID_VERIFICATION_CODE':
            FocusScope.of(context).requestFocus(FocusNode());
            setState(() {
              errorMessage = 'Invalid Code';
            });
            print('error');
            break;
          default:
            print('error');
            break;
        }
      }
    }

     

    • أعجبني 1
  18. بتاريخ منذ ساعة مضت قال بلال زيادة:

    ممكن توفق كامل الكود بعد التعديل الذي قمت به ، يرجى وضع الكود داخل ملف و إرفاق الملف كاملا

    اهلا بك اخي مثالك كان شغال لدي ولكن المشكلة كانت في كود الاتصال قمت بوضع دالة شرطيه فيه وتم حل المشكله ولله الحمد كل الشكر على اضافتك فادتني كثير 

    • أعجبني 1
  19. بتاريخ الآن قال بلال زيادة:

    هذا مثال قمت بوضعه ، اسف لم انتبه انني لم أوضح أن هذا الكود مثال ، ولكن هذه widget أقوم بتمرير اليها البيانات و من ثم في هذه widget أقوم ببناء الواجهة و توزيع البيانات على الواجهة.

    انا قمت بتطبيقه بشكل مختلف ولكن نفس الكود المشكله ان بعد ان تتوقف CircularProgressIndicator لا تظهر الصورة في حالة عدم توفر البيانات 

    قمت بوضع الصوره هنا بستبدال return Container();

    • أعجبني 1
  20. بتاريخ 16 دقائق مضت قال بلال زيادة:

    ما تفعله خاطئ, يجب عليك إظهار صورة التحميل , أو صورة التي تدل على أن البيانات يتم جلبها في FutureBuilder , بحيث تتحقق من وصول البيانات باستخدام snapshot.hasData بهذه الطريقة 

    
    return snapshot.hasData ? _build(context,snapshot.data) : Container();

    بحيث إذا لا توجد بيانات يمكنك تغيير Container إلى الصورة التي تستخدمها أو إلى 

    
    CircularProgressIndicator()

    فتكون FutureBuilder بهذا الشكل كاملاً 

    
    child: FutureBuilder<List<ProductsModel>>(
    future: future,
    builder: (BuildContext context, AsyncSnapshot snapshot) {
    switch (snapshot.connectionState) {
      case ConnectionState.none:
      return Center(
      child: Text('No Connection'),
      );
      break;
      case ConnectionState.waiting:
      case ConnectionState.active:
      return CircularProgressIndicator();
      break;
      case ConnectionState.done:
      if (snapshot.hasError) {
      print(snapshot.error);
      print("Dashboard Error");
    }
    
    return snapshot.hasData ? _build(context, snapshot.data) : CircularProgressIndicator();
    break;
    }
    return Container();
    },
    ),

     

    اهلا بك اخي الكريم 

    شاكر لك ردك اخي 

    سوال لو سمحت في هذا السطر

    return snapshot.hasData ? _build(context, snapshot.data) : CircularProgressIndicator();

    ما المقصود بـ _build هنا ؟

    • أعجبني 1
  21. تحيه طيبه للجميع 

    استعمال الكود التالي لتحقق من توفر البيانات في القائمة من عدمه :

    Widget getTasListView() {
            return arrList.isNotEmpty
                ? ListView.builder(
                    itemCount: arrList.length,
                    itemBuilder: (BuildContext context, int position) {
                      return Card(
                        color: Colors.white,
                        elevation: 2.0,
                        child: Column(
                          children: <Widget>[
                            ListTile(
                              title: Text(this.list[position].task),
                              onLongPress: () =>
                                  navigateToDetail(this.list[position], 'Edit Task'),
                            )
                          ],
                        ),
                      );
                    })
                : Center(child: Image.asset("path/image/img.png"));
          }

     

    المشكله التي اعاني منها ان الصوره في بعض الاوقات تظهر قبل انتهاء الاتصال او ظهور العناصر في القائمة حتى لو كانت ليست فارغه بمعنى حسب ما فهمت ان لو تاخر تحميل العناصر قليلا يتم اظهار الصوره حتى ظهور العناصر ثم تظهر العناصر وتختفي الصوره 

    هل يوجد حل لهذا المشكله بحيث لو كان هنالك بيانات انا لا احتاج الى اظهار الصوره كامل فقط تظهر لو لم يكن هنالك بيانات 

     

    وهذا الكود المستعمل للاتصال مع قاعدة البيانات :

     Future<List<Data>> fetchNotes() async {
        final String url = 'https://***************.php?id=' + id.toString();
        var response = await http.post(Uri.parse(url));
        var flowers = List<Data>();
        if (response.statusCode == 200) {
    
            final flowersJsonData = json.decode(response.body).cast<Map<String, dynamic>>();
            for (var flower in flowersJsonData) {
              flowers.add(Data.fromJson(flower));
            }
    
        }
        else {
          throw Exception('Failed to load data from Server.');
        }
        return flowers;
      }

     

    • أعجبني 1

  22. تعديل على سوالي الثاني :  تم الحل اخي الكريم شكرا لك وللفائده كالتالي :

    المشكله كانت بعد تعديل بطريقةالمشار اليها في الاعلى من الاخ @Wael Aljamal كل الشكر لك اخي الكريم.

    نحن في حاجة الى اظهار نص او صورة للمستخدم في حالة كانت القائمة فارغة و طريقة الحل كانت بتحقق من القائمة في البداية 

    مثال على الحل منقول:

    Widget getTasListView() {
            return arrList.isNotEmpty
                ? ListView.builder(
                    itemCount: arrList.length,
                    itemBuilder: (BuildContext context, int position) {
                      return Card(
                        color: Colors.white,
                        elevation: 2.0,
                        child: Column(
                          children: <Widget>[
                            ListTile(
                              title: Text(this.list[position].task),
                              onLongPress: () =>
                                  navigateToDetail(this.list[position], 'Edit Task'),
                            )
                          ],
                        ),
                      );
                    })
                : Center(child: Image.asset("path/image/img.png"));
          }

    هنا تم التحقق في البداية اذا كانت ليست فارغة وفي حالة انها فارغة تظهر صورة للمستخدم

    • أعجبني 1
  23. تحيه طيبه للجميع

    اقوم بالاستعلام عن بيانات في قاعدة البيانات نوع mysql من خلال الاتصال من فلاتر الى ملف php وجلب البيانات 

    في حالة وجود بيانات الكود شغال 100%100 بدون ان تظهر رسالة الخطاء هذا ولكن في حالة عدم توفر بيانات في الجدول البيانات  احصل على الخطاء التالي :

    E/flutter (19611): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: FormatException: Unexpected character (at character 1)
    E/flutter (19611): <br />
    E/flutter (19611): ^
    E/flutter (19611): 
    E/flutter (19611): #0      _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1404:5)
    E/flutter (19611): #1      _ChunkedJsonParser.parseNumber (dart:convert-patch/convert_patch.dart:1271:9)
    E/flutter (19611): #2      _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:936:22)
    E/flutter (19611): #3      _parseJson (dart:convert-patch/convert_patch.dart:40:10)
    E/flutter (19611): #4      JsonDecoder.convert (dart:convert/json.dart:506:36)
    E/flutter (19611): #5      JsonCodec.decode (dart:convert/json.dart:157:41)
    E/flutter (19611): #6      _HomePageState.fetchNotes (package:testapp/Your.dart:115:38)
    E/flutter (19611): <asynchronous suspension>
    E/flutter (19611): #7      _HomePageState.initState.<anonymous closure> (package:testapp/Your.dart)
    E/flutter (19611): <asynchronous suspension>
    E/flutter (19611): 

     

     

    الكود المستعمل للاستعلام:

      Future<List<Data>> fetchNotes() async {
        final String url = 'https://***************.php?id=' + id.toString();
        var response = await http.post(Uri.parse(url));
        var flowers = List<Data>();
        if (response.statusCode == 200) {
    
            final flowersJsonData = json.decode(response.body).cast<Map<String, dynamic>>();
            for (var flower in flowersJsonData) {
              flowers.add(Data.fromJson(flower));
            }
    
        }
        else {
          throw Exception('Failed to load data from Server.');
        }
        return flowers;
      }

     

     

    php file:

    <?php
    
    
    include 'con.php';
    
      $id=$_GET['id'];
    
    
    
    $sql = "SELECT * FROM user WHERE id=?";
    
    $stmt = $con->prepare($sql); 
    
    $stmt->bind_param("s",$id);
    
    $stmt->execute();
    
    $result = $stmt->get_result();
    
     
    if ($result) {
     
     
    	 while($row[] = $result->fetch_assoc()) {
    	 
    	 $item = $row;
    	 
    	 $json = json_encode($item, JSON_NUMERIC_CHECK);
    	 
    	 }
     
    } else {
      
       echo "No Data Found.";
    }
     echo $json;
    $con->close();
    
    ?>

     

     

    ياليت اذا احد لديه فكره عن حل للمشكله يفيدنا

    شكرا لكم

    • أعجبني 1
  24. تحيه طيبه للجميع

    كل ما حاولت ارفع تطبيقي على جوجل بلاي احصل على الاشعار التالي:

    يحتوي App Bundle على رموز برمجية أصلية، ولم يتم تحميل أي رموز لتصحيح الأخطاء. ننصحك بتحميل ملف رموز لتسهيل عملية تحليل الأعطال وأخطاء ANR وتصحيح الأخطاء فيهما.

    ما المقصود بها وكيف يمكن تجنبها او حلها ؟ وهل توجد مخاطر على تطبيقي منها ؟

    مع العلم ان برمجة تطبيقي flutter

    • أعجبني 1
  25. بتاريخ 57 دقائق مضت قال بلال زيادة:

    لا يظهر التطبيق بسرعة كبيرة على المتجر يجب الأنتظار كم يوم حتى يظهر , ايضا عند البحث عن باسم التطبيق و اسم المطور يكون قد ظهور لأنك بحثت باسمه أو باسم مطوره ولكن في حالة وجود تطبيقات مشابهة و تكون أقدم من تطبيقك فسوف تظهر قبل تطبيقك و يكون تطبيقك في الصفحات التالية , ايضا حاول الاهتمام بوصف التطبيق و اسمه و محاولة تمييزه بكلمات دليلة تدل عليه مما تساعد في تقدمه في نتائج البحث الأولى. ولكن لا تقلق سوف يظهر تطبيقك مع مرور الوقت في الصفحات الأولى بعد الزيارات و التحميلات التي سوف تتم عليه. 

    اهلا بك اخي بلال 

    المشكله الذي احترت فيها ان تطبيقي السابق يظهر على طول حتى لو في صفحات مختلفه 

    اما هذا قمت بتمرير حتى وصلت الى نهاية الصفحات ولم اجده ولكن لو قمت بالبحث باسم المطور يظهر لدي 

    • أعجبني 1
×
×
  • أضف...