Как выполнить функцию onPressed() до загрузки остальной части виджета?
Итак, у меня есть асинхронная функция, которую я выполняю, когда нажимаю день в календаре. Если в базе данных хранится информация на этот день, я добавляю результат в Список задач. Это та функция
// This code is suppose to get all the taskNames of user on clicked day
Future<void> getUserEvents() async {
//We get Collection of 'userAssignments' from database
final CollectionReference userAssignments =
Firestore.instance.collection('userAssignments');
//We get current logged in user
FirebaseUser user = await FirebaseAuth.instance.currentUser();
//This is used to format a DateTime of selected day to String 'yyyy-MM-dd'
var formater = new DateFormat('yyyy-MM-dd');
String formatted = formater.format(_controller.selectedDay);
//We get rid off a all the unneded data from list
tasks.clear();
//This is a query, We loop through entire collection and we look for a document
// with email of logged in user and we look for a day that is
// equal to selected formated day (variable formatted)
userAssignments
.where("userEmail", isEqualTo: user.email)
.where("eventDayForCalendar", isEqualTo: formatted)
.snapshots()
.listen((data) => data.documents.forEach((doc) {
// We get a taskName from that document and we add it to our local List tasks
String taskName = doc["taskName"];
tasks.add(taskName);
}));
}
А вот и код виджета. Внизу кода столбец отвечает за отображение карточки для каждого элемента в задачах списка.
//This is the class in which you can initialize widgets
class _CalendarPageState extends State<CalendarPage> {
final DatabaseService _dbServices = DatabaseService();
final AuthService _auth = AuthService();
//This List stores all found tasks while conducting a getUserEvents()
List<String> tasks = new List<String>();
//Here is placed the code from above
@override
Widget build(BuildContext context) {
return Scaffold(
//This creates a box that sorrounds the calendar and makes it scrollable
body: SingleChildScrollView(
child: Column(
children: <Widget>[
TableCalendar(
events: _events,
//Set the calendar controler parameter
calendarController: _controller,
//Set the starting day of the week to monday
startingDayOfWeek: StartingDayOfWeek.monday,
//Set default calendar format to week
initialCalendarFormat: CalendarFormat.week,
onDaySelected: (day, events) async {
//Here i call the function that executes query and
// stores results in list tasks
await getUserEvents();
setState(() {
_selectedEvents = events;
});
},
//Start defining the calendar style
calendarStyle: CalendarStyle(
todayColor: Colors.green,
selectedColor: Colors.blue,
),
headerStyle: HeaderStyle(
titleTextStyle: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
),
//Hide the formatter for week/month
formatButtonShowsNext: false,
formatButtonVisible: false,
centerHeaderTitle: true,
),
),
Column(
children: tasks
.map((i) => new Card(
child: ListTile(
title: Text(i.toString()),
leading: Icon(Icons.assignment_turned_in),
)))
.toList())
],
),
),
);
}
Вот как это выглядит, когда функция загружается до виджета столбца
И вот как это выглядит в тот же день, если виджет загружается до завершения функции
Может быть, есть виджет, который приостанавливает выполнение кода под ним или внутри него?
1 ответ
Решение
I think if you add setState((){ tasks =tasks; });
at the end of getUserEvents() the widget should rebuild.