我正试图在strembuilder和listbuilder的帮助下实现分页。但是,当我接收第2页数据时,listbuilder重复第1页数据,然后绑定第2页数据。
class _DashboardPageState extends State<DashboardPage> {
final _refreshIndicatorKey = new GlobalKey<RefreshIndicatorState>();
List<NewsList> list = [];
ScrollController _controller;
int page = 0;
@override
initState() {
noticeBloc.count();
page = 0;
list = [];
newsListBloc.list(page);
_controller = ScrollController()..addListener(_scrollListener);
super.initState();
}
_scrollListener() {
if (_controller.offset >= _controller.position.maxScrollExtent - 10 &&
!_controller.position.outOfRange) {
setState(() {
page += 1;
print("Page Number $page");
});
newsListBloc.list(page);
}
}
@override
Widget build(BuildContext context) {
return AppBody(
child: Container(
decoration: appStyle.authBox(),
child: RefreshIndicator(
key: _refreshIndicatorKey,
semanticsLabel: "Loading News...",
displacement: 20.0,
onRefresh: reLoadNews,
child: StreamBuilder<List<NewsList>>(
stream: newsListBloc.getNewsList,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
//case ConnectionState.active:
print("API status waiting");
return Container(
child: Center(
child: CircularProgressIndicator(
strokeWidth: 1.0,
),
),
);
default:
return newsList(snapshot);
}
},
),
),
),
floatingChild: FloatingActionButton(
backgroundColor: Colors.red,
child: Icon(
Icons.add,
color: Colors.white,
),
onPressed: addNewNews,
),
);
}
newsList(snapshot) {
list.addAll(snapshot.data);
return ListView.builder(
controller: _controller,
shrinkWrap: true,
physics: AlwaysScrollableScrollPhysics(),
itemCount: list.length ,
itemBuilder: (BuildContext context, int index) {
NewsList nl=list[index];
return GestureDetector(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => NewsDetail(id: nl),
),
);
},
child: NewsTemplete(newsList: nl)
);
},
);
}
}
输出 第一次击中api 10记录时出现并在屏幕上显示,但在secound上击中屏幕上的列表,例如 1个 2 。 。 在第二时间它将绑定列表,如 1个 2 。 。 10 1个 2 。 。 11 。 。 20