Привет стек переполнение !
У меня есть просмотр страницы, который создается, если логическое значение установлено в 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,),
],
);
}
}