Flutter ListBuilder与StreamBuilder一起使用时重复数据

时间:2019-07-28 17:42:06

标签: flutter dart

我正试图在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

0 个答案:

没有答案