Почему мой PageView пропускает страницу при перелистывании после setState с новыми данными? - PullRequest
0 голосов
/ 28 апреля 2020

Привет стек переполнение !

У меня есть просмотр страницы, который создается, если логическое значение установлено в true. При вызове setState я проверяю, есть ли новые данные (изнутри сборки). Если есть, я получаю эти новые данные и пытаюсь восстановить с новыми данными.

Родитель восстанавливает при добавлении нового элемента в мои данные. Это перестраивает этот виджет NoteSet, сбрасывает мою переменную currentPage и создает новый PageController с начальной страницей, являющейся новой первой страницей. Но при переходе к следующему страницы пропускают один. если я проведу пальцем в обратном направлении, это будет выглядеть так, как будто я всегда был на второй странице, и я снова на первой странице.

Я попытался создать новый контроллер страницы, если есть новые данные, это ничего не сделало, но помогло я сужу это к чему-то не так с PageView.builder. Это похоже на то, что контроллер получает новую страницу, но PageView.builder сохраняет старый индекс controller.page ... Я не уверен.

Future checkDataChanged() async {
    if((await readCategoryNotes(widget.category)).length != sortedNotes.length)
    {
      controller.jumpToPage(sortedNotes.length - 1);
      setState(() {
        dataReady = false;
        sortedNotes.clear();
      });
      getNotes();
    }
  }

  Future getNotes() async {
    sortedNotes = await readCategoryNotes(widget.category);
    setState(() {
      sortNotes();
      currentPage = (sortedNotes.length - 1).toDouble();
      dataReady = true;
    });
  }
@override
  Widget build(BuildContext context) {
    if(dataReady)
      checkDataChanged();
    return Column(
      children: <Widget>[
        Padding(
          padding: EdgeInsets.symmetric(horizontal: 10.0),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Text(widget.category.toString().split(".").last,
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 46.0,
                  fontWeight: FontWeight.bold,
                  letterSpacing: 1.0,
                )
              ),

            ],
          ),
        ),
        ((){
            if(dataReady){
              controller = PageController(initialPage: sortedNotes.length - 1);
              controller.addListener(() {
                setState(() {
                  currentPage = controller.page;
                });
              });
              return Column(
                children: <Widget>[
                  Padding(
                    padding: const EdgeInsets.only(left: 15.0),
                    child: Row(
                      children: <Widget>[
                        Text("${sortedNotes.length} Entries",
                            style: TextStyle(color: Colors.tealAccent[200]))
                      ],
                    ),
                  ),
                  Stack(
                    children: <Widget>[
                      CardScrollWidget(currentPage, sortedNotes, largeCards ? 0.8 : 1.2),
                      Positioned.fill(
                        child: GestureDetector(
                          onTap: () {
                            editNoteDialog(context, sortedNotes[currentPage.round()], refresh);
                          },
                          onLongPress: () {
                            deleteNoteDialog(context, sortedNotes[currentPage.round()], refresh);
                          },
                          child: new ScrollConfiguration(
                            behavior: PageScrollBehavior(),
                            child: new PageView.builder(
                              itemCount: sortedNotes.length,
                              controller: controller,
                              reverse: true,
                              itemBuilder: (context, index) {
                                return Container();
                              },
                            ),
                          ),
                        ),
                      )
                    ],
                  ),
                ],
              );
            }
            else{
              return Padding(
                padding: const EdgeInsets.all(20.0),
                child: Center(
                  child: SpinKitPulse(
                    color: Colors.tealAccent,
                    size: 60.0,
                  ),
                ),
              );
            }
          }()),
        SizedBox(height: 15,),
      ],
    );
  }
}
...