Флаттер - мне нужен FutureBuilder здесь? - PullRequest
0 голосов
/ 11 марта 2019

В этом примере я пытаюсь понять, нужно ли мне использовать FutureBuilder, чтобы значение логического «выбранного» было доступно для моего метода onTap.

return Card(
        color: Color.fromARGB(255, 233, 30, 99),
        elevation: 5.0,
        child: InkWell(
          splashColor: Colors.blueGrey,
          onTap: () {
              return setState(
                () {
                  this.selected = !this.selected;
                  selected == true
                      ? model.disAllowTouchSounds()
                      : model.allowTouchSounds();
                },
              );
          },
          child: Padding(
            padding: EdgeInsets.only(left: 10.0, right: 10.0),
            child: StreamBuilder<String>(
              stream: stream1,
              builder: (context, snapshot1) {
                return StreamBuilder<String>(
                  stream: stream2,
                  builder: (context, snapshot2) {
                    if (snapshot1.hasData && snapshot2.hasData) {
                      if (snapshot1.data
                              .toString()
                              .contains('TOUCH SOUNDS ALLOWED') ||
                          snapshot2.data.toString().contains('DND OFF')) {
                        selected = false;
                        return TouchOn();
                      } else if (snapshot2.data
                              .toString()
                              .contains('ALARMS ONLY ON') ||
                          snapshot2.data.toString().contains('DND ON')) {
                        selected = true;
                        isDisabled = true;
                        return TouchOff();
                      }
                    }

Поскольку моему Streambuilder, вероятно, требуется немного времени для сборки, мне интересно, может ли this.selected =! This.selected работать должным образом, как есть.

Причина, по которой я спрашиваю, заключается в том, что мне иногда приходится дважды нажимать для вызова метода disAllowTouchSounds (). В идеале я бы хотел избежать этой ситуации.

1 Ответ

0 голосов
/ 12 марта 2019

this.selected = !this.selected происходит внутри setState (), поэтому оно всегда должно работать. Сделайте так, чтобы ваша функция построителя StreamBuilder была установлена ​​selected внутри вызова setState ().

...