3

我正在尝试实现分页,但我找不到任何关于我应该如何创建控制器监听器函数的例子——或者我应该把它放在哪里。请指教。让我知道我是否也应该添加更多信息。

目前,我的监听器函数如下所示:

(within initState)
    pagecontroller.addListener(() {
      print(pagecontroller.page);
      if (pagecontroller.page == _postslist.length-1) {
        fetchMore();
      }
    });

当前发生的情况是该函数仅被调用一次,随后再也不会被调用。

4

2 回答 2

2

我不知道这个问题是否仍然存在(自从你问起已经六个月了),但由于这个问题仍然没有标记为正确的答案,我会尝试。

如果我理解正确,您希望在到达 PageView 的最后一项后将更多项目加载到您的 PageView 中。为此,您不需要 initState 中的侦听器。您可以检查是否已到达最后一个项目onPageChanged,然后加载更多项目。

它应该像这样工作:

PageView.builder(
                      controller: _pageController,
                      itemCount: _items.length,
                      onPageChanged: (i) {
                        
                        if (i == _items.length - 1) {
                         getMoreItems().then((value) {
                            setState(() {
                              _items= value;
                            });
                          });
                        }
                      },
)
于 2021-03-01T14:46:14.700 回答
0

我猜你正在尝试听 pageController 来获取 currentPage。如果是这种情况,您应该使用 PageController 通过其方法(animateToPage、jumpToPage、nextPage、previousPage)触发一个事件,以便它可以唤起您的侦听器。

我假设我的页面转换由 PageView.builder 处理

您可以在文档中找到 PageView.builder 描述,如下所示:

此构造函数适用于具有大量(或无限)子级的页面视图,因为仅对那些实际可见的子级调用构建器。

因此,它支持您在大量页面的情况下有效地构建屏幕。您仍然需要自己处理页面之间的导航。

我上面包含的链接有一个您可以参考 PageController 用法的示例。为方便起见,我将其包括在此处:

class MyPageView extends StatefulWidget {
  MyPageView({
    Key key
  }): super(key: key);

  _MyPageViewState createState() => _MyPageViewState();
}

class _MyPageViewState extends State < MyPageView > {
  PageController _pageController;

  @override
  void initState() {
    super.initState();
    _pageController = PageController();
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: PageView(
          controller: _pageController,
          children: [
            Container(
              color: Colors.red,
              child: Center(
                child: RaisedButton(
                  color: Colors.white,
                  onPressed: () {
                    if (_pageController.hasClients) {
                      _pageController.animateToPage(
                        1,
                        duration: const Duration(milliseconds: 400),
                          curve: Curves.easeInOut,
                      );
                    }
                  },
                  child: Text('Next'),
                ),
              ),
            ),
            Container(
              color: Colors.blue,
              child: Center(
                child: RaisedButton(
                  color: Colors.white,
                  onPressed: () {
                    if (_pageController.hasClients) {
                      _pageController.animateToPage(
                        0,
                        duration: const Duration(milliseconds: 400),
                          curve: Curves.easeInOut,
                      );
                    }
                  },
                  child: Text('Previous'),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
于 2020-08-29T03:53:41.810 回答