获取小部件动态列表的值-Flutter

时间:2018-09-17 18:11:15

标签: flutter flutter-layout

我设法制作了一个动态问卷,将Flutter与Firestore联系起来。

我自定义的 Question 小部件只是一个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 :(得分:0)

您需要保留所有滑块的状态。我建议您使用BLoC模式进行状态管理。

You can read about it here

编辑:您可以有一个List<int>来将值保存在您的bloc中,并且在每个滑块中,您将实现函数onChangeEnd: bloc.addValue并将滑块值发送到bloc,这会将它们添加到列表中。 然后在按钮上,您将看到类似onPressed: () => bloc.sendFeedback()的内容,它将从列表中获取值并将其写入Firestore。

请记住,这是我现在脑海中的一个解决方案,供您了解概念

答案 1 :(得分:0)

就此应用而言,拥有一个全局变量就足够了

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模式,但是我无法使其按预期工作。也许我会很快再试一次,然后将解决方案发回。