使用 Pageview.builder 在 Flutter 中分页
Pagination in Flutter using Pageview.builder
我正在尝试实现分页,但我找不到任何示例说明我应该如何创建控制器侦听器函数 - 或者我应该把它放在哪里。请指教。如果我也应该添加更多信息,请告诉我。
目前,我的侦听器函数如下所示:
(within initState)
pagecontroller.addListener(() {
print(pagecontroller.page);
if (pagecontroller.page == _postslist.length-1) {
fetchMore();
}
});
目前发生的情况是该函数只被调用一次,之后再也不会被调用。
我猜你正在尝试监听 pageController 以获取当前页面。如果是这种情况,您应该使用 its methods(animateToPage、jumpToPage、nextPage、previousPage)使用 PageController 触发事件,以便它可以唤起您的听众。
I assume my page transitions are handled by the PageView.builder
您可以在这样的文档中找到 PageView.builder 描述:
This constructor is appropriate for page views with a large (or infinite) number of children because the builder is called only for those children that are actually visible.
因此它支持您在大量页面的情况下高效地构建屏幕。您仍然需要自己处理页面之间的导航。
我上面包含的 link 有一个示例,您可以参考 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'),
),
),
),
],
),
),
);
}
}
我不知道这个问题是否仍然存在(你问已经六个月了),但由于这个问题仍然没有被标记为正确的答案我会试试。
如果我理解正确的话,您希望在到达 PageView 的最后一个项目后将更多项目加载到您的 PageView 中。为此,您不需要 initState 中的侦听器。您可以只检查是否已到达 onPageChanged
中的最后一项,然后加载更多项。
它应该像这样工作:
PageView.builder(
controller: _pageController,
itemCount: _items.length,
onPageChanged: (i) {
if (i == _items.length - 1) {
getMoreItems().then((value) {
setState(() {
_items= value;
});
});
}
},
)
我正在尝试实现分页,但我找不到任何示例说明我应该如何创建控制器侦听器函数 - 或者我应该把它放在哪里。请指教。如果我也应该添加更多信息,请告诉我。
目前,我的侦听器函数如下所示:
(within initState)
pagecontroller.addListener(() {
print(pagecontroller.page);
if (pagecontroller.page == _postslist.length-1) {
fetchMore();
}
});
目前发生的情况是该函数只被调用一次,之后再也不会被调用。
我猜你正在尝试监听 pageController 以获取当前页面。如果是这种情况,您应该使用 its methods(animateToPage、jumpToPage、nextPage、previousPage)使用 PageController 触发事件,以便它可以唤起您的听众。
I assume my page transitions are handled by the PageView.builder
您可以在这样的文档中找到 PageView.builder 描述:
This constructor is appropriate for page views with a large (or infinite) number of children because the builder is called only for those children that are actually visible.
因此它支持您在大量页面的情况下高效地构建屏幕。您仍然需要自己处理页面之间的导航。
我上面包含的 link 有一个示例,您可以参考 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'),
),
),
),
],
),
),
);
}
}
我不知道这个问题是否仍然存在(你问已经六个月了),但由于这个问题仍然没有被标记为正确的答案我会试试。
如果我理解正确的话,您希望在到达 PageView 的最后一个项目后将更多项目加载到您的 PageView 中。为此,您不需要 initState 中的侦听器。您可以只检查是否已到达 onPageChanged
中的最后一项,然后加载更多项。
它应该像这样工作:
PageView.builder(
controller: _pageController,
itemCount: _items.length,
onPageChanged: (i) {
if (i == _items.length - 1) {
getMoreItems().then((value) {
setState(() {
_items= value;
});
});
}
},
)