GridView.count () не обновляется при изменении значений в cron - PullRequest
0 голосов
/ 10 января 2020

Что я пытаюсь сделать

То, что я пытаюсь сделать, - это извлекать данные из вызова API и передавать данные в ответ на виджет GridView.count() каждый минуту, потому что данные могут измениться.

Я сделал это с помощью виджета FutureBuilder и функциональности Cron из cron / cron.dart , если это поможет.

Вот код:

FutureBuilder<dynamic>(
    future: Api.getFoods(),
    builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
        List<Widget> slots = [];

        if (snapshot.data == null) {
        return Text('');
        }

        var data = snapshot.data;
        cron.schedule(new Schedule.parse('*/1 * * * *'), () async {
            setState(() {
                data = snapshot.data;
            });
            slots = [];
        });

        for (int i = 0; i < snapshot.data.length; i++) {
            slots.add(new FoodSlot(
                snapshot.data[i]['name'],
                snapshot.data[i]['created_at'],
                snapshot.data[i]['qty'].toString()
            ));
        }

        return new GridView.count(
            crossAxisCount: 2,
            scrollDirection: Axis.vertical,
            children: slots
        );
})

Виджет FoodSlot создает Card и отображает значение, переданное в аргументах на карточке.

Что я пробовал

После отладки я увидел, что работа cron работает нормально, но виджеты GridView просто не обновляются.

Я попытался использовать виджет Text вместо GridView и возвращает значения, возвращаемые вызовом API, и виджет обновляется автоматически каждую 1 минуту, как и ожидалось.

Почему GridView.count() действует так и как я могу это исправить?


ОБНОВЛЕНИЕ

Когда внесены изменения в базу данных, GridView обновляется, но только когда приложение перезапускается (используя R, а не r).

1 Ответ

0 голосов
/ 11 января 2020

Решено!

Оказывается, мне пришлось добавить задание cron в виджет FoodSlot и периодически обновлять сам виджет.

Закончилось добавлением следующего в функцию initState() для FoodSlot:

@override
  void initState() {
    super.initState();
    colorSettings = HelperFunctions.setStateColour(expiry);

    cron.schedule(new Schedule.parse('*/1 * * * *'), () async {
      setState(() {
        Api.getFood(id).then((res) {
          expiry = res['created_at'];
          name = res['name'];
          qty = res['qty'].toString();
          colorSettings = HelperFunctions.setStateColour(expiry);
        });
      });
    });
  }

Где id - идентификатор записи базы данных, на которую ссылается виджет FoodSlot.

Надеюсь, это кому-нибудь поможет:)

...