تنفيذ setState يتسبب في رفرفة حلقة لانهائية

3

أنا جديد على Flutter وأواجه مشكلة في الولاية. إذا كان أي شخص يمكن أن يساعدني سأكون ممتنًا لذلك.

لذلك أقوم في البداية بتعيين عناصر القائمة المنسدلة Flutter إلى قائمة ، والتي سوف نسميها List l وقيمتها أيضًا ، والتي ستستدعي المتغير v.

ثم في بداية القطعة الرئيسية ، قبل البناء ، أسمي طريقة تحصل على بعض المعلومات من قاعدة بيانات sqlflite. وعندما تعود ، أقوم بإنشاء قائمة جديدة من القائمة المنسدلة وتنفيذ الدولة الجديدة. قمت بتعيين List l على العنصر الذي تم إنشاؤه حديثًا والقيمة على القيمة الأولى للعنصر الأول من القائمة ، بحيث يتم إعادة عرض القائمة المنسدلة.

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

شكرا جزيلا!

    // Declaring variables
    List<DropdownMenuItem> _classList;

    String _chosenClass;


    initState:

    @override

    void initState() {

     _classList = [DropdownMenuItem(

       child: Text("Choose Class"),

       value: null,)];

     _chosenClass = _classList.first.value;

     super.initState();

    }


    // Get info from sqlflite database: 

    getClassesToDisplay() {

     debugPrint("Works");

     getDatabaseInstances(tableClass, [className]).then((classNames){

       if(classNames.length > 0){

         List<DropdownMenuItem> tempList =[];

         classNames.forEach((classArg){

           tempList.add(

               DropdownMenuItem(

                 child: Text(classArg[className]),

                 value: classArg[className],

               )

           );

         });

         debugPrint("TEMPLIST: ${tempList}");

         setState(() {

           _classList = tempList;

           _chosenClass = tempList.first.value;

         });

       }


     });


    }


    // Build:

    @override

    Widget build(BuildContext context) {

     getClassesToDisplay();

     debugPrint("BLAHHHH");

     return new Scaffold(

       appBar: new AppBar(

         title: new Text("Your Classes"),

       ),

       body: Column(

         children: <Widget>[

           Container(

             margin: EdgeInsets.only(top: 10.0, left: 10.0),

             child: raisedButtonMaker("Tap to add a class", (){

               Navigator.pushNamed(context, '/add_seek');

             }, Theme.of(context).primaryColor, context)

           ,),

           DropdownButton(

             value: _chosenClass, //value of currently picked item

             items: _classList,

             onChanged: (value){ //update value of dropDown to what was just chosen

               setState(() {

                 _chosenClass = value;

               });

             },

           ),

         ],

       ),

     );

    }

1 إجابة

4
افضل جواب

getClassesToDisplay() المكالمات setState() مع تأخير ( then ) والذي يسبب build() ليتم تشغيله ، والذي يستدعي getClassesToDisplay() - حلقة بسيطة لا نهاية لها.

إزالة getClassesToDisplay() من عند build() وندعوها initState() في حين أن.

:مؤلف
فوق
قائمة طعام