Как обновить SimpleDialog во флаттере без встроенного компоновщика внутри, как при использовании, значение снаружи не обновляется - PullRequest
0 голосов
/ 12 февраля 2020

Мой запрос прост. У меня есть Icons.add и Icons.remove на основе условия, имеет ли массив значение или нет. и этот массив преобразуется в строку с .join() в flutter.

Если я использую Stateful Builder from flutter, значение внутри simpleDialog обновляется, и поэтому значки меняются по мере необходимости, но тогда я не я не могу получить данные на экране, откуда я звоню dailog widget.

. Сейчас я могу получить доступ к нужным данным, только значки не обновляются.


showAlertDialog(BuildContext context) {
  // set up the SimpleDialog
  SimpleDialog dialog = SimpleDialog(
    title: const Text('Choose Your Health Issue'),
    children: <Widget>[
      Container(
        width: MediaQuery.of(context).size.width * 0.9,
        height: MediaQuery.of(context).size.height * 0.9,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                shrinkWrap: true,
                itemCount: hi.length,
                itemBuilder: (BuildContext ctxt, int index) {
                  return InkWell(
                    onTap: () => setState(() {
                      var x = hi[index].title;
                      if(hIssue.contains(x)){
                          hIssue.removeAt(hIssue.indexOf(x));                        
                          print("removing -> $x");
                      } else {
                          hIssue.add(x);
                          print("adding -> $x");
                      }
                    }),
                    child: Padding(
                      padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                          Text(
                            hi[index].title.toString(), 
                            style: Theme.of(context).textTheme.title.copyWith(fontSize: 14),
                          ),
                          (hIssue.contains(hi[index].title)) ? Icon(Icons.remove) : Icon(Icons.add)
                        ],
                      ),
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    ],
  );

  // show the dialog
  showDialog(
    context: context,
      builder: (BuildContext context) {
        return dialog;
      },
    );
  }
}

1 Ответ

0 голосов
/ 12 февраля 2020

Если я правильно понял, вам нужен результат из выбора, данного пользователю в диалоге. Функция showDialog возвращает будущее. Это будущее вернет вам значение решения.

void showDialogAlert(context){
  showDialog(
    context: context,
    builder: (context) {
      return dialog;
    }
  ).then((valueFromDialog){
    print('do something with the value $valueFromDialog');
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...