#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.