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

The getter 'length' was called on null

السؤال

نشر (معدل)

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

أقوم بعرض مجموعة من الصور التي تأتي من قاعدة بيانات على السيرفر الصور يتم عرضها بشكل جيد ولكني لدي مشكلة مع عمل dots لهذا الصور او مؤشر التحرك وموقع الصور الحالي

الكود شغال ولكن اول من أقوم بتشغيل الكود احصل على الخطاء التالي:

 

The getter 'length' was called on null.
Receiver: null
Tried calling: length

المشكلة على ما يبدو في الوقت المستغرق في تحميل dots او البداية يكون فارغ 

 

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

الكود كالتالي :

  var responsebody;

  Future getdataImage() async {

    apiURL = 'https:****************;
    var response = await http.post(Uri.parse(apiURL));
     responsebody=jsonDecode(response.body);
    if (responsebody.length >0){

      return responsebody;

    }else{

    }
  }

 

                FutureBuilder(
    future: getdataImage(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        if (snapshot.data != null) {
          return
            PageView.builder(
                onPageChanged: onPageViewChange,
                itemCount: snapshot.data.length,
                itemBuilder: (BuildContext context, int index) {
                  return Container(
                    child: Column(children: <Widget>[
                      InkWell(
                          child: CachedNetworkImage(
                            imageUrl: "${snapshot.data[index]['image']}",
                            width: double.infinity,
                            height: 400,
                            fit: BoxFit.cover,
                            
                            errorWidget:
                                (context, url, error) =>
                                Icon(Icons.error),
                          ),
                      )
                    ]
                        
                    ),

                  );
                });
        }
      }else {
        return  CircularProgressIndicator();
      }
    }

                                ),
                                Align(
                                  alignment: Alignment.bottomCenter,
                                  child: Container(
                                    height: 40,
                                    decoration: BoxDecoration(
                                        gradient: LinearGradient(
                                            begin: Alignment.topCenter,
                                            end: Alignment.bottomCenter,
                                            colors: [
                                          Colors.black.withOpacity(0.0),
                                          Colors.black.withOpacity(0.5)
                                        ])),
                                    child: Align(
                                      alignment: Alignment.center,
                                      child:
                                        buildDots(context)
                                    ),
                                  ),
                                )

 

 

  Widget buildDots(BuildContext context) {
    Widget widget;

    List<Widget> dots = [];

    for (int i = 0; i <responsebody.length; i++) {
      Widget w = Container(
        margin: EdgeInsets.symmetric(horizontal: 5),
        height: 8,
        width: 8,
        child: CircleAvatar(
          backgroundColor: page == i ? Colors.blue : Colors.grey[100],
        ),
      );
      dots.add(w);
    }
    widget = Row(
      mainAxisSize: MainAxisSize.min,
      children: dots,
    );
    return widget;
  }
}

 

تم التعديل في بواسطة مروان مروان3

Recommended Posts

  • 1
نشر

الكود غير مكتمل ولم أتمكن من تحديد ما إذا كنت تستخدم stateful أو stateless. ولكن من الأفضل استخدام setState لتغيير حالة المتغيرات في حال كانت ستغيّر من حالة الواجهة لديك بدلاً من تعديل قيمة resposnebody بشكل مباشر، عن طريق إضافة مؤشر من نمط boolean مثلاً للدلالة على أنه تم تحميل البيانات بشكل كامل من الخادم

setState(() { _loaded = true; });

وعندها يمكنك التحكّم بعدم الوصول إلى جزء الكود الذي يعتمد على طول المصفوفة length في حال كانت قيمة هذا المتغيّر false.

وإذا كنت تستخدم النسخ الأخيرة من dart ستتمكن من تجنب هذه الأخطاء من خلال خاصيات null safety.

كما يجب عليك استخدام try و catch عند طلبات التعامل مع خادم الويب لتجنب الأخطاء التي قد تحدث عند عدم القدرة على جلب البيانات أو الاتصال بالخادم.

  • 0
نشر
بتاريخ On 2/28/2022 at 14:59 قال Sam Ahw:

الكود غير مكتمل ولم أتمكن من تحديد ما إذا كنت تستخدم stateful أو stateless. ولكن من الأفضل استخدام setState لتغيير حالة المتغيرات في حال كانت ستغيّر من حالة الواجهة لديك بدلاً من تعديل قيمة resposnebody بشكل مباشر، عن طريق إضافة مؤشر من نمط boolean مثلاً للدلالة على أنه تم تحميل البيانات بشكل كامل من الخادم


setState(() { _loaded = true; });

وعندها يمكنك التحكّم بعدم الوصول إلى جزء الكود الذي يعتمد على طول المصفوفة length في حال كانت قيمة هذا المتغيّر false.

وإذا كنت تستخدم النسخ الأخيرة من dart ستتمكن من تجنب هذه الأخطاء من خلال خاصيات null safety.

كما يجب عليك استخدام try و catch عند طلبات التعامل مع خادم الويب لتجنب الأخطاء التي قد تحدث عند عدم القدرة على جلب البيانات أو الاتصال بالخادم.

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...