Изменение текстового значения для каждого элемента списка во флаттере - PullRequest
0 голосов
/ 09 мая 2020

У меня есть список кнопок. Функция onPressed запускает функцию datePicker, после выбора даты текст кнопки должен измениться на выбранную дату. Каждая дата сохраняется в списке значений DateTime, «дат», который я использую позже. Список дат и listView - это динамические c, их длина зависит от числа, выбранного пользователем. Я инициализировал buttonText и установил его значение в initState на date. Проблема в том, что после выбора даты на каждой кнопке отображается одна и та же дата.

Future<DateTime> _pickDate() async {
    DateTime chosen = DateTime.now();
    DateTime date = await showDatePicker(
        context: context,
        initialDate: pickedDate,
        firstDate: DateTime(DateTime.now().year - 100),
        lastDate: DateTime.now());
    if (date != null) {
      setState(() {
        chosen = date;
        print(chosen);
        dates.add(chosen);
        print(dates);
      });
    }
    return chosen;
  }
Widget _dateList() {
    return Container(
      margin: EdgeInsets.all(10),
      width: MediaQuery.of(context).size.width * 0.8,
      height: MediaQuery.of(context).size.height * 0.1,
      decoration: BoxDecoration(
          //border: Border.all(
          //  color: Colors.red
          // )
          ),
      child: ListView.builder(
          scrollDirection: Axis.horizontal,
          shrinkWrap: true,
          itemCount:
              pregController.text == '' ? 0 : int.parse(pregController.text),
          itemBuilder: (BuildContext context, int index) {
            DateTime birth = DateTime.now();
            return Container(
              padding: EdgeInsets.all(5),
              width: MediaQuery.of(context).size.width * 0.3,
              child: RaisedButton(
                  color: Colors
                      .primaries[Random().nextInt(Colors.primaries.length)],
                  key: Key(index.toString()),
                  child: Text(
                    buttonText,
                    textAlign: TextAlign.center,
                    style: GoogleFonts.lato(
                        textStyle: TextStyle(
                      color: Colors.white,
                    )),
                  ),
                  onPressed: () async {
                    birth = await _pickDate();
                    setState(() {
                      buttonText =
                          '${dates[index].day}/${dates[index].month}/${dates[index].year}';
                    });
                  }),
            );
          }),
    );
  }

1 Ответ

0 голосов
/ 09 мая 2020

Попробуйте что-то вроде этого:

class Test1 extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => Test1State();

}

class Test1State extends State<Test1> {
  List<DateTime> dates = [
    DateTime.now(),
    DateTime.now(),
    DateTime.now(),
    DateTime.now(),
    DateTime.now(),
  ];

  @override
  Widget build(BuildContext context) => Scaffold(
    body: _dateList(),
  );

  Future<DateTime> _pickDate(DateTime initialDate) async {
    DateTime chosen = DateTime.now();
    DateTime date = await showDatePicker(
        context: context,
        initialDate: initialDate,
        firstDate: DateTime(DateTime.now().year - 100),
        lastDate: DateTime.now());
    if (date != null) {
      setState(() {
        chosen = date;
        print(chosen);
        dates.add(chosen);
        print(dates);
      });
    }
    return chosen;
  }

  Widget _dateList() {
    return Container(
      margin: EdgeInsets.all(10),
      width: MediaQuery.of(context).size.width * 0.8,
      height: MediaQuery.of(context).size.height * 0.1,
      decoration: BoxDecoration(
        //border: Border.all(
        //  color: Colors.red
        // )
      ),
      child: ListView.builder(
          scrollDirection: Axis.horizontal,
          shrinkWrap: true,
          itemCount: dates.length,
          itemBuilder: (BuildContext context, int index) {
            DateTime birth = DateTime.now();
            return Container(
              padding: EdgeInsets.all(5),
              width: MediaQuery.of(context).size.width * 0.3,
              child: RaisedButton(
                  color: Colors
                      .primaries[Random().nextInt(Colors.primaries.length)],
                  key: Key(index.toString()),
                  child: Text(
                    '${dates[index].day}/${dates[index].month}/${dates[index].year}',
                    textAlign: TextAlign.center,
                  ),
                  onPressed: () async {
                    birth = await _pickDate(birth);
                    setState(() {
                      dates[index] = birth;
                    });
                  }),
            );
          }),
    );
  }

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