Flutter RefreshIndicator «Нет данных» Виджет - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть RefreshIndicator, который загружает ListView после завершения Feature, однако я хотел сделать так, чтобы если функция возвращала пустой набор данных - показывать другой виджет - «Нет данных» вместо ListView.

Мне удалось сделать это с помощью троичного оператора, однако виджет «Нет данных» отображается во время обновления, пока не будет заменен на ListView.

Как отобразить виджет «Нет данных»ТОЛЬКО ПОСЛЕ того, как обновление завершилось?

Вот мой код:

return RefreshIndicator(
    key: _refreshIndicatorKey,
    onRefresh: AppConfig.of(context).flavorName != FLAVOR_NAME.DEV
        ? () {
            bloc.page = 1;
            return bloc.getTasks(status, context).then((list) {
              setState(() {
                tasksList = list;
              });
            });
          }
        : () => Future.delayed(Duration(seconds: 2)),
    child: tasksList.length > 0
        ? ListView.builder(
            physics: const AlwaysScrollableScrollPhysics(),
            controller: _scrollController,
            itemCount: tasksList.length + 1,
            itemBuilder: (context, index) {
              if (index == tasksList.length) {
                return _buildProgressIndicator();
              } else {
                Task item = tasksList != null ? tasksList[index] : null;
                return GestureDetector(
                    onTap: () {
                      Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) {
                                return TaskDetailsScreen(index, item);
                              },
                              settings: RouteSettings(
                                  name: ScreenName.taskDetails)));
                    },
                    child: MyTasksListItem(taskData: item));
              }
            },
          )
        : Stack(children: [
            Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Image.asset(
                    'assets/tumbleweed.gif',
                  ),
                ]),
            Positioned(
                bottom: 50,
                left: 0.0,
                right: 0.0,
                child: Align(child: Text(allTranslations.text('no_tasks'))))
          ]));

Виджет «Нет данных» - это стек в моем случае.

1 Ответ

0 голосов
/ 19 февраля 2019

Возможно, решение, подобное этому, сработает:

 onRefresh: AppConfig.of(context).flavorName != FLAVOR_NAME.DEV
    ? () {
        setState(() {
            loading = true;
        });

        bloc.page = 1;
        return bloc.getTasks(status, context).then((list) {
          setState(() {
            loading = false;
            tasksList = list;
          });
        });
      }

, а в вашем индикаторе child:

child: Container(
    child: loading ?
       null :
       tasksList.length > 0
          ? ListView.builder(..........
...