Как я могу вернуть значение, которое содержит StatefulWidget, чтобы использовать его в ListView.builder? - PullRequest
0 голосов
/ 08 мая 2020

У меня проблема, бывает, что у меня есть StatefulWidget с методом, который возвращает ListView.builder.

ListView.builder, у которого есть столбец с двумя дочерними элементами: textField и row с двумя radios.

Радиобутоны встроены в другой StatefulWidget этого виджета с полным состоянием. Меня интересует значение, которое было выбрано, но мне нужно это возвращаемое значение в моем предыдущем StatefulWidget.

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

Вот ListView. Builder:

ListView.builder(
    scrollDirection: Axis.vertical,
    shrinkWrap: true,
    itemCount: preguntas.secciones[0].preguntas.length,
    itemBuilder: (BuildContext context, int i) {
      final pregunta = questionsList[i];
      return Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Text(pregunta.descripcion,
              style: TextStyle(fontFamily: "OpenSans-Bold")),
          RadioButtom(),
          TextFormField(
            enabled:
                (!_radioValue && pregunta.respuestas[0].pregunta.obligatoria)
                    ? false
                    : true,
            validator: (value) {
              if (pregunta.respuestas[0].pregunta.obligatoria == true &&
                  value.isEmpty) {
                return 'Por favor ingrese texto';
              }
              return null;
            },
            decoration: InputDecoration(
              hintMaxLines: 500,
              hintText: pregunta.respuestas[0].pregunta.descripcion,
              hintStyle:
                  TextStyle(fontFamily: "OpenSans-Regular", fontSize: 14.0),
            ),
            onChanged: (value) {
              preguntasGlobal = preguntas;
              // preguntasGlobal[i].respuestas[0].comentario = value;
              // preguntasGlobal[i].respuestas[0].respuesta = true;
            },
          ),
          SizedBox(height: 20.0)
        ],
      );
    },
  );

Вот виджет StatefulWidget RadioButtom

class RadioButtom extends StatefulWidget {
  @override
  _RadioButtomState createState() => _RadioButtomState();
}

class _RadioButtomState extends State<RadioButtom> {
  bool _radioValue =
      false; //se usa como estado y tambien para mantener el valor del radiobuttom seleccionado
  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Radio(
            value: true,
            groupValue: _radioValue,
            onChanged: (value) {
              setState(() {
                _radioValue = value;
              });
            }),
        Text(
          'Yes',
          style: TextStyle(
            fontSize: 12.0,
            fontFamily: "OpenSans-Regular",
          ),
        ),
        Radio(
            value: false,
            groupValue: _radioValue,
            onChanged: (value) {
              setState(() {
                _radioValue = value;
              });
            }),
        Text(
          'No',
          style: TextStyle(
            fontSize: 12.0,
            fontFamily: "OpenSans-Regular",
          ),
        )
      ],
    );
  }
}

1 Ответ

1 голос
/ 08 мая 2020

Вы поднимаете состояние. Вместо того, чтобы сохранять состояния в RadioButtom, вы сохраняете состояние в виджете, который содержит ListView, скажем, ListViewBuilder.

  1. Измените конструктор вашего RadioButtom, чтобы он принял значение и обратный звонок
class RadioButtom extends StatefulWidget {
  @override
  _RadioButtomState createState() => _RadioButtomState();

  RadioButtom({this.value, this.onChanged});

  final bool value;
  final ValueChanged<bool> onChanged;
}
Используйте поле в вашем State
Radio(
  value: true,
  groupValue: widget.value,
  onChanged: widget.onChanged,
),
Сохраните свое состояние в ListViewBuilder
// For example
List<bool> _answers = []; // Initialize it with number of elements you need
Используйте его в своем itemBuilder
RadioButtom(
  value: _answers[i],
  onChanged: (value) {
    setState(() {
      _answers[i] = value;
    });
  }),
),
...