Flutter создает новый экземпляр класса нажатием кнопки и обновляет значения

#flutter #dart

#flutter #dart

Вопрос:

Я создаю функцию, позволяющую пользователям добавлять события (название и дату) в список в Flutter. Я настроил функции, но я изо всех сил пытаюсь понять, как сначала создать новый экземпляр моего класса DateToRemember при нажатии моей кнопки «добавить», а затем, когда введено текстовое значение заголовка и дата, выбранная в моем datepicker, обновить этот экземпляр этими значениями. Затем пользователи смогут нажать кнопку отправки, и их список обновится.

Вот моя дата, чтобы запомнить модель:

   class DateToRemember {
  String title;
  DateTime date;

  DateToRemember(this.title, this.date);
}
  

И код страницы datestoremember:

 class DatesToRemember extends StatefulWidget {
  @override
  _DatesToRememberState createState() => _DatesToRememberState();
}

class _DatesToRememberState extends State<DatesToRemember> {
  TextEditingController _titleController = new TextEditingController();

  DateTime startDate = DateTime.now();

  DateTime pickedDate = DateTime.now();

  DateFormat formatter = DateFormat('dd/MM/yyyy');

  _DatesToRememberState();

  Future displayDatePicker(BuildContext context) async {
    final DateTime picked = await showDatePicker(
        context: context,
        initialDate: startDate,
        firstDate: startDate,
        lastDate: DateTime(DateTime.now().year   100));
    if (picked != null)
      setState(() {
        pickedDate = picked;
        print(DateFormat('dd/MM/yyyy').format(pickedDate).toString());
      });

  }

  final List<DateToRemember> occasions = [
    DateToRemember("Occasion 1", DateTime.now()),
    DateToRemember("Occasion 2", DateTime.now()),
    DateToRemember("Occasion 3", DateTime.now()),
  ];

  String input;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        resizeToAvoidBottomInset: false,
        appBar: AppBar(
          leading: GestureDetector(
              onTap: () => Navigator.pop(context),
              child: Icon(Icons.arrow_back)),
          title: Text('Dates to Remember'),
        ),
        backgroundColor: Colors.white,
        body: Center(
          child: Column(children: [
            SizedBox(
              height: 10.0,
            ),
            Container(
              width: MediaQuery.of(context).size.width * 0.8,
              child: Text(
                "It can be difficult to ",
                style: TextStyle(fontFamily: FontNameDefault),
              ),
            ),
            SizedBox(
              height: 50.0,
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Align(
                alignment: Alignment.centerRight,
                child: FloatingActionButton(
                    backgroundColor: kPrimaryColor,
                    child: Icon(Icons.add),
                    onPressed: () {
                      // CREATE NEW INSTANCE OF DATETOREMEMBER CLASS
                      showDialog(
                          context: context,
                          builder: (BuildContext context) {
                            return AlertDialog(
                              title: Text('Add occasion'),
                              content: Container(
                                height: 150.0,
                                child: Column(
                                  children: [
                                    TextField(
                                      decoration: InputDecoration(
                                          hintText: 'Occasion Title'),
                                      //UPDATE TITLE IN CLASS WITH INPUT
                                      //
                                    ),
                                    TextField(
                                      decoration: InputDecoration(
                                          hintText: 'Pick Date'),
                                      onTap: () async {
                                        await displayDatePicker(context);
                                        //SELECT DATE AND UPDATE INSTANCE OF CLASS
                                      },
                                    ),
                                    FlatButton(
                                      child: Text('Submit'),
                                      onPressed: () {
                                        //Navigator.of(context).pop();
                                      },
                                    ),
                                  ],
                                ),
                              ),
                            );
                          });
                    }),
              ),
            ),
            Container(
              height: MediaQuery.of(context).size.height * 0.6,
              width: MediaQuery.of(context).size.width * 0.9,
              decoration:
                  BoxDecoration(border: Border.all(color: Colors.black26)),
              child: occasions.isEmpty
                  ? Center(
                      child: Text(
                      'Add an occasion',
                      style: TextStyle(color: Colors.black),
                    ))
                  : ListView.builder(
                      itemCount: occasions.length,
                      itemBuilder: (BuildContext context, int index) {
                        return Dismissible(
                          direction: DismissDirection.endToStart,
                          onDismissed: (direction) {
                            occasions.removeAt(index);
                            Scaffold.of(context).showSnackBar(new SnackBar(
                              content: Text('Occasion Removed'),
                              duration: Duration(seconds: 5),
                            ));
                          },
                          key: UniqueKey(),
                          child: Card(
                            elevation: 8.0,
                            margin: EdgeInsets.all(8),
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(8),
                            ),
                            child: ListTile(
                              title: Text(occasions[index].title),
                              subtitle: Text(DateFormat('dd/MM/yyyy')
                                  .format(occasions[index].date)
                                  .toString()),
                              trailing: IconButton(
                                icon: Icon(
                                  Icons.delete,
                                  color: Colors.red,
                                ),
                                onPressed: () {
                                  setState(() {
                                    occasions.removeAt(index);
                                    Scaffold.of(context)
                                        .showSnackBar(new SnackBar(
                                      content: Text('Occasion Removed'),
                                      duration: Duration(seconds: 5),
                                    ));
                                  });
                                },
                              ),
                            ),
                          ),
                        );
                      }),
            )
          ]),
        ));
  }
}
  

Я все еще новичок в flutter / dart, поэтому не совсем уверен, является ли то, о чем я прошу, лучшим способом достичь того, чего я хочу, поэтому также открыт для новых идей. Спасибо.

Комментарии:

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

2. Это интересная идея. Как моя логика… когда пользователь нажимает кнопку «Добавить», я могу создать 2 новые переменные, одну для заголовка и одну для даты. После выбора и нажатия пользователем кнопки «Отправить» добавить значения, присвоенные переменным, в новый экземпляр моего класса?

3. Да, как вы и сказали. Сначала пользователь нажимает кнопку добавить и выбирает дату и название. Когда пользователь нажимает на кнопку отправки, вы создаете новый экземпляр DateToRemember с датой из DatePicker и со строкой вашего TextEditingController.