Как выполнить функцию 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.

Другие вопросы по тегам