setState () не refre sh мой трепет интерфейса - PullRequest
0 голосов
/ 01 мая 2020

Я использую пользовательское popupmenuitem внутри popupmenubutton, я хотел изменить цвет значка при нажатии, поэтому я использовал bools для идентификации. Проблема в том, что я использую setState для изменения значений, значение меняется, конечно, но пользовательский интерфейс (цвет) не меняется! Я не могу понять это. Я вставляю свой код здесь. Это все внутри панели приложения. Также я попытался использовать виджет строителя, но он не решил мою проблему.

actions: <Widget>[
            PopupMenuButton(
                tooltip: 'Filters',
                padding: EdgeInsets.all(0),
                icon: Icon(
                  Icons.filter_list,
                  color: Colors.black54,
                ),
                itemBuilder: (BuildContext context) {
                  {
                    return <PopupMenuEntry>[
                      //locN
                      PopupItem(
                        child: GestureDetector(
                          onTap: () {
                            if(!_nearMe && !_specificLoc){
                              FilterList.selectedFilter.add(FilterList.nearMe);
                              print(FilterList.selectedFilter);
                              setState(() {
                                _nearMe = true;
                              });
                            }
                            else if (_specificLoc){
                              FilterList.selectedFilter.remove(FilterList.specificLoc);
                              FilterList.selectedFilter.add(FilterList.nearMe);
                              setState(() {
                                _specificLoc = false;
                                _nearMe = true;
                              });
                              print(FilterList.selectedFilter);
                            }
                            else{
                              setState(() {
                                _nearMe = false;
                              });

                              FilterList.selectedFilter.remove(FilterList.nearMe);
                              print(FilterList.selectedFilter);
                            }
                          },
                          child: ListTile(
                            leading: Icon(Icons.info_outline, color: _nearMe?Colors.green:Colors.black54,),
                            title: Text(FilterList.nearMe),
                          ),
                        ),
                      ),
                      //loc
                      PopupItem(
                        child: GestureDetector(
                          onTap: () {
                            if(!_nearMe && !_specificLoc){
                              FilterList.selectedFilter.add(FilterList.specificLoc);
                              print(FilterList.selectedFilter);
                              setState(() {
                                _specificLoc = true;
                              });
                            }
                            else if (_nearMe){
                              FilterList.selectedFilter.remove(FilterList.nearMe);
                              FilterList.selectedFilter.add(FilterList.specificLoc);
                              setState(() {
                                _nearMe = false;
                                _specificLoc = true;
                              });
                              print(FilterList.selectedFilter);

                            }
                            else{
                              setState(() {
                                _specificLoc = false;
                              });

                              FilterList.selectedFilter.remove(FilterList.specificLoc);
                              print(FilterList.selectedFilter);
                            }
                          },
                          child: ListTile(
                            leading: Icon(Icons.info_outline, color: _specificLoc?Colors.green:Colors.black54,),
                            title: Text(FilterList.specificLoc),
                          ),
                        ),
                      ),

bool _specificLo c и _nearMe используются для изменения цвета в листе.

1 Ответ

0 голосов
/ 01 мая 2020

Я исследовал это, но единственным рабочим решением для этой ситуации был построитель потоков. Пожалуйста, скажите мне, если у вас есть лучший метод. setState обычно не работает с itemBuilder или виджетами, которые принимают контекст родителя. Снова скажи мне, если я не прав! Вот мое решение

//This the class for streams
class BlocDemo{

  StreamController streamListController = StreamController<Color>.broadcast();

//sink
  Sink get colorSink => streamListController.sink;

//stream
  Stream<Color> get colorStream => streamListController.stream;

  changeColorGreen() {
    colorSink.add(Colors.green);
  }
  changeColorBlac(){
    colorSink.add(Colors.black54);
  }
}

И использование

actions: <Widget>[
            PopupMenuButton(
                tooltip: 'Filters',
                padding: EdgeInsets.all(0),
                icon: Icon(
                  Icons.filter_list,
                  color: Colors.black54,
                ),
                itemBuilder: (context) {
                  {
                    return <PopupMenuEntry>[

                      PopupItem(
                        child: GestureDetector(
                          onTap: () {
                         //the color is added to the sink
                              colorBloc.changeColorGreen();
                          },
                          child: StreamBuilder<Object>(
                            initialData: Colors.black54,
                            stream: colorBloc.colorStream,

                            builder: (context, snapshot) {
                              return ListTile(
                                leading: Icon(Icons.info_outline, color: snapshot.data),
                                title: Text(FilterList.nearMe),
                              );
                            }
                          ),
                        ),
                      ),
...