Получить значения динамического списка виджетов - флаттер - PullRequest
0 голосов
/ 17 сентября 2018

Мне удалось создать динамическую анкету, связывающую флаттер с Firestore.

Мои пользовательские Вопрос виджеты - это просто Text (), содержащий строку вопроса, и Slider () чтобы пользователь мог дать ответ от 1 до 5

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

Вот мой код:

var questions = <Widget>[];

//Async read to the DB
Future query() async {
  var snap = await Firestore.instance
    .collection("Forms")
    .document(formID)
    .get();

  var arr = <Widget>[]; //just a temp holder of the widgets
  for(String q in list){
    arr.add(Question(min: 1.0, max: 5.0, question: q, value: 1.0,));
  }

  setState(() {
    questions = arr;
  });
}

И затем в сборке я рендеринг:

Scaffold(
  body:Container(
    child:Column(
      children: <Widget>[
        Text("Title"),
        Column(
          children: questions,
        ),
        RaisedButton(
          onPressed: () => sendFeedback(),
          color: Colors.redAccent,
          textColor: Colors.white,
          child: Text("Send")
      ]
    )

Каким будет код для функции sendFeedback ()?Я хотел бы получить значения для всех ползунков в моем списке children , а затем записать их в Firestore всего за один вызов в БД.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Для этого приложения достаточно иметь глобальную переменную

Map<String, double> responses = Map();

, которое сбрасывается, когда я перехожу к вопроснику, и затем каждый Слайдер должен обновить Карту следующим образом ( onChange ):

Slider(
  value: value,
  min: widget.min,
  max: widget.max,
  divisions: (widget.max - 1).round(),
  label: value.ceil().toString(),
  activeColor: color,
  onChanged: (double val1) {
     //Force a re-render
     setState(() {
       //Update the value of the Slider
       value = val1;
       //Do some operations, assign a color based on the result
       double p = value / widget.max;
       if (p > 0 && p <= 0.3) {
         color = Colors.red;
       } else if (p > 0.3 && p <= 0.6) {
         color = Colors.orangeAccent;
       } else {
         color = Colors.green;
       }
       //Update the value of the parent Widget
       widget.value = value;
       ratings[widget.question] = value;

       //Done, print in console for debugging
       print(value);
     });
   })

Я потратил довольно много времени на паттерн BLoC, но не смог заставить его работать так, как ожидалось. Возможно я скоро попробую это снова и отправлю назад решение.

0 голосов
/ 17 сентября 2018

Вам нужно удерживать состояние всех ползунков. Я бы порекомендовал вам шаблон BLoC для управления состоянием.

Вы можете прочитать об этом здесь

Редактировать: у вас может быть List<int> для хранения значений в вашем блоке, и в каждом ползунке вы будете реализовывать функцию onChangeEnd: bloc.addValue и отправлять значение ползунка в блок, который будет добавлять их в список. Тогда на кнопке у вас будет что-то вроде onPressed: () => bloc.sendFeedback(), которое возьмет значения из списка и запишет их в Firestore.

Имейте в виду, что это решение на моей голове прямо сейчас, чтобы вы поняли концепцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...