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

السؤال

نشر

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

أقوم بعملية بجلب البيانات من السيرفر وعرضها من خلال FutureBuilder و ListView

المشكلة انني في كل مره احضر البيانات احصل على الخطاء التالي:

LateInitializationError: Field '_getTaskAsync@199262776' has not been initialized.

وموقع الخطاء في future

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

class _HomePageState extends State<MyApp> {

  bool showicon=false;
  var ListDataPrefs;
  late Future _getTaskAsync;
  @override
  void initState() {
    Future.delayed(Duration.zero, () {
      _getTaskAsync=ApiUser();
    });

    super.initState();
  }

  Future ApiUser() async {
    setState(() {
      showicon = true;
    });
    final String url = '***************=';
    var response = await http.post(Uri.parse(url));
    var responsebody = jsonDecode(response.body);

    if (responsebody.length > 0) {
      return responsebody;
    } else {
      showicon = false;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(

        body:Center(child: Container(

        child: ListView(
          children: <Widget>[
          FutureBuilder(
                future: _getTaskAsync,
                builder: (context, AsyncSnapshot snapshot) {
                  if (snapshot.hasData) {
                    return ListView.builder(
                        physics: ScrollPhysics(),
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        itemCount: snapshot.data.length,
                        itemBuilder: (context, index) {
                          return
                          Card(
                        
                            child: Container(
                              padding: EdgeInsets.all(6),
                              child: Row(
                                children: <Widget>[

                                  Flexible(
                                    child: Column(

                                      children: <Widget>[
                                        MergeSemantics(
                                          child: Row(
                                            children: <Widget>[
                                              Flexible(
                                                child: Text(
                                                    "${snapshot.data[index]['name']}",

                                                ),
                                              )
                                            ],
                                          ),
                                        ),


                                      ],
                                    ),
                                  )
                                ],
                              ),
                            ),
                          );
                        }
                    );

                  } else if (snapshot.hasError) {

                    return Center(
                        child: Image.asset(
                          'assets/data.png',
                          fit: BoxFit.contain,
                          width: 180,
                          height: 180,
                        ));

                  }


                  return showicon? SizedBox(
                    height: MediaQuery.of(context).size.height / 1.3,
                    child: Center(
                      child: CircularProgressIndicator(
                        valueColor:
                        new AlwaysStoppedAnimation<Color>(Colors.black),
                      ),
                    ),
                  ):Text('');
                }



            ),


          ],
        ),
        )
        )
   
   
    );
  }
}

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

Recommended Posts

  • 1
نشر

عملية التهيئة تختبر قيمة المتغير هل هي null أم لا.

وبذلك وضع late ليس سليم في هذه الحالة، أي يجب أن يكون نمط المتغير nullable

Future? _getTaskAsync;

 

كما أن هنالك ملاحظة، إسناد قيمة لدالة غير متزامنة يتوجب استخدام await قبل الاستدعاء

 _getTaskAsync = await ApiUser();

 

  • 0
نشر
بتاريخ 10 دقائق مضت قال Wael Aljamal:

عملية التهيئة تختبر قيمة المتغير هل هي null أم لا.

وبذلك وضع late ليس سليم في هذه الحالة، أي يجب أن يكون نمط المتغير nullable


Future? _getTaskAsync;

 

كما أن هنالك ملاحظة، إسناد قيمة لدالة غير متزامنة يتوجب استخدام await قبل الاستدعاء


 _getTaskAsync = await ApiUser();

 

مرحبا اخي

ساقوم بتجربة ذلك

الا يوجد حل لوضع تحقق من البيانات في future ؟

  • 0
نشر
بتاريخ الآن قال مروان مروان3:

الا يوجد حل لوضع تحقق من البيانات في future ؟

أعتقد أن المشكلة في محاولة الدالة ApiUser الوصول للحالة وتعديلها قبل الانتهاء من التهيئة.

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

أي الأفضل أن تكون قيمة showicon=true في البداية،

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...