Я создаю приложение расписания. (Я новичок)
У меня есть Card () с двумя полями, в котором есть asyn c метод выбора DateRange onPressed :() asyn c {...} . После ввода данных пользователем в List хранятся две переменные - в идеале начало недели и конец недели . После этого я проверяю, является ли это недельным интервалом, то есть только с понедельника по воскресенье. Если это так, я передаю эти значения в глобальные переменные в setState, чтобы эти поля в Card () обновлялись по выбору пользователя.
Исходя из этого диапазона, мне нужно будет собрать 7 карт (каждая карта на день недели). ). Для построения этих карт мне придется использовать FutureBuilder или есть лучшие решения ? Мне нужно передать ненулевые значения в Future of FutureBuilder, который я получаю от selected await DateRangePicker . Как мне выполнить sh это или есть лучшие / более простые решения?
import 'package:flutter/material.dart';
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
import 'package:intl/intl.dart';
import 'package:date_range_picker/date_range_picker.dart' as DateRangePicker;
String formattedWeekStart;
String formattedWeekEnd;
DateTime datetimeStart;
DateTime datetimeEnd;
bool displayTimeCards = false;
List<HoursPerDayCard> listOfCards = [];
DateFormat dateFormat = DateFormat("MM-dd");
class PickWeekRange extends StatefulWidget {
@override
_PickWeekRangeState createState() => _PickWeekRangeState();
}
class _PickWeekRangeState extends State<PickWeekRange> {
@override
void initState() {
super.initState();
formattedWeekEnd = null;
formattedWeekStart = null;
}
static DateTime pushStartToMonday(now) {
var monday = 1;
while (now.weekday != monday) {
now = now.subtract(new Duration(days: 1));
}
return now;
}
DateTime mondayPicker = pushStartToMonday(DateTime.now());
@override
Widget build(BuildContext context) {
return Card(
elevation: 2,
child: MaterialButton(
disabledColor: Colors.white,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Row(
children: <Widget>[
DatePickerWeek(
title: 'Week beginning (Monday)',
weekValue:
),
],
),
SizedBox(
height: 10,
),
Row(
children: <Widget>[
DatePickerWeek(
title: 'Week ending (Sunday)',
weekValue: formattedWeekEnd,
),
],
),
],
),
),
onPressed: () async {
final List<DateTime> picked = await DateRangePicker.showDatePicker(
context: context,
initialFirstDate: mondayPicker /*DateTime.now()*/,
initialLastDate: mondayPicker.add(new Duration(days: 6)),
firstDate: DateTime(2015),
lastDate: DateTime(DateTime.now().year + 2));
if (picked != null && picked.length == 2) {
if (picked[1].subtract(Duration(days: 6)) == picked[0] &&
picked[0].weekday == 1) {
displayTimeCards = true;
setState(() {
datetimeStart = picked[0];
datetimeEnd = datetimeStart.add(Duration(days: 6));
formattedWeekStart = dateFormat.format(picked[0]);
formattedWeekEnd = dateFormat.format(picked[1]);
// displayTimeCards = true;
});
} else {
setState(() {
// displayTimeCards = false;
});
showAlertDialog(context);
}
} // IF
}, //async
//onPressed
),
);
}
}
FutureBuilder. Как вернуть getFuture () с этими двумя значениями - начало и конец (когда они изменяются с нуля на диапазон понедельник-воскресенье) в buildTimeSheetList () ??? Таким образом, он строит мои карты для каждого дня недели после того, как пользователь вводит правильный диапазон недели.
для getFuture Я пытался имитировать диапазон с понедельника по воскресенье, как я делал это в воскресенье:)
Future<Widget> getFuture() {
return buildTimeSheetList(datetimeStart, datetimeEnd);
// Future.delayed(
// Duration(seconds: 2),
// () => buildTimeSheetList(DateTime.now().subtract(Duration(days: 2)),
// DateTime.now().add(Duration(days: 4))));
}
StatefulWidget:
return Container(
color: Colors.blueGrey,
child: Container(
child: ListView(children: <Widget>[
PickWeekRange(),
FutureBuilder(
future: getFuture(),
builder: (BuildContext context, snapshot) {
return Container(
height: 800.0,
child: snapshot.hasData
? Column(children: <Widget>[snapshot.data])
: Text('Select the week'),
);
},
),
]),
)
);
Вот как это должно выглядеть: первоначальный вид в ожидании действий пользователя
А после того, как пользователь выбрал «правильную» неделю, он должен взять карты для выбранная неделя: Финальная версия с FutureBuilder или лучшим решением