Home > Back-end >  Flutter Prevent FutureBuilder from running twice
Flutter Prevent FutureBuilder from running twice

Time:10-28

I am using FutureBuilder in flutter to fill up a drop down menu DropdownButtonFormField, i have the method

                            onChanged: (String? newValue) {
                              setState(() {
                                dropdownBrokers = newValue!;
                              });
                            },

Which allows the widget to rebuild and then assign the new value selected from the dropdown list. However, i am now experiencing a problem from my research stating that whenever the setState() is called, the future builder runs again, which makes my dropdown menu populate again. This is the full code snippet

     FutureBuilder <List<Broker>>(
      future: brokerData,
      builder: (context, snapshot){
        if(snapshot.hasData){
          //do what needs to be done here
          List<Broker>? data = snapshot.data;
          for(var i = 0; i< data!.length; i  ){
            _brokers.add(data[i].firmName);
            print(data[i].firmName);
          }

             return Container(
                      padding: EdgeInsets.all(10),
                      child: InputDecorator(
                        decoration: InputDecoration(
                            labelStyle: TextStyle(
                                color: Colors.grey
                            ),
                            isDense: true,
                            contentPadding: EdgeInsets.all(7.0),
                            errorStyle: TextStyle(color: Colors.redAccent, fontSize: 16.0),
                            hintText: 'Select Broker',
                            border: OutlineInputBorder(borderRadius: BorderRadius.circular(5.0))),
                        child: DropdownButtonHideUnderline(
                          child: DropdownButtonFormField<String>(
                            alignment: Alignment.center,
                            value: dropdownBrokers,
                            icon: const Icon(Icons.arrow_downward),
                            iconSize: 24,
                            elevation: 16,
                            style: const TextStyle(color: Colors.indigo),

                            
                            onChanged: (String? newValue) {
                              setState(() {
                                dropdownBrokers = newValue!;
                              });
                            },

                            items: _brokers.map<DropdownMenuItem<String>>((String value) {
                              return DropdownMenuItem<String>(
                                value: value,
                                child: Text(value),
                              );
                            }).toList(),
                          ),
                        ),
                      ),
                    ),
  );

Also i get an error when i reselect an item. How do i prevent the FutureBuilder from running twice

CodePudding user response:

FutureBuilder will always be rendered once unless recreated in the build method. So the solution to this can be done in two ways: 1: Only calling brokerData in the FutureBuilder method or 2: Only calling ```brokerData`` in the initState override. You can not do both.

And I assume the data to be populated in the dropdown comes from the future builder. Then use snapshot.data of the future instead of an already created value in this case:

items: _brokers.map<DropdownMenuItem<String>>((String value) {
                             return DropdownMenuItem<String>(
                               value: value,
                               child: Text(value),
                             );

Change to:

items: snapshot.data.map<DropdownMenuItem<String>>((String value) {
                              return DropdownMenuItem<String>(
                                value: value,
                                child: Text(value),
                              );
  • Related