如何解决如何在flutter中调用_scrollController时仅更新一次整数值?
我正在用_scrollController
实现Listview.separated
来实现分页。一次滚动一次,整数int page
只需要更新一次,但是在我的情况下,一次滚动一次,整数_scrollController.addListener(() {
double maxScroll = _scrollController.position.maxScrollExtent;
double currentScroll = _scrollController.position.pixels;
double delta = MediaQuery.of(context).size.height * 0.25;
if(maxScroll - currentScroll < delta){
page = page +1;
print("page number checking right Now");
print(page);
}
});
只需更新20次。
如果有一次滚动尝试,我应该如何确保仅将此号码更新一次?
CODE
{{1}}
解决方法
我有同样的问题。您可以尝试使用它
class _ItemsState extends State<Items> with AutomaticKeepAliveClientMixin {
final _controller = ScrollController();
bool _isLoading = false;
@override
Widget build(BuildContext context) {
super.build(context);
return NotificationListener<ScrollEndNotification>(
onNotification: (onNotification) {
/// When the user croll to the end of the list
if (_controller.position.extentAfter < 50 &&
context.read<StateManager>().currentState !=
NotifierState.completed) {
if (!_isLoading) {
context.read<StateManager>().loadingMoreItem();
setState(() {
_isLoading = true;
});
Future.delayed(const Duration(milliseconds: 0)).then((value) {
_controller
.animateTo(
onNotification.metrics.maxScrollExtent + kToolbarHeight,duration: const Duration(milliseconds: 100),curve: Curves.ease)
.then((value) {
context
.read<StateManager>()
.nextState()
.then((value) => _isLoading = false);
});
});
}
}
return false;
},child: RefreshIndicator(
onRefresh: context.watch<StateManager>().reloadItem,color: Colors.white,child: ListView.builder(
padding: const EdgeInsets.symmetric(horizontal: 8.0,vertical: 8.0),addAutomaticKeepAlives: true,shrinkWrap: true,controller: _controller,itemBuilder: (context,index) {
if (index == widget.products.length) {
return LoadingItemWidget();
} else
return ProductWidget(
product: widget.products[index],);
},itemCount: widget.products.length + 1,//itemExtent: 105,),);
}
@override
bool get wantKeepAlive => true;
}
,
执行此操作的一种方法是这样。
class _MyWidgetState extends State<MyWidget> {
final _scrollController = ScrollController();
int page = 0;
double lastMaxScroll = 0;
int numberOfItems = 100;
@override
void initState(){
_scrollController.addListener(() {
double maxScroll = _scrollController.position.maxScrollExtent;
double currentScroll = _scrollController.position.pixels;
double delta = MediaQuery.of(context).size.height * 0.25;
if(maxScroll - currentScroll < delta && lastMaxScroll != maxScroll){
page = page + 1;
lastMaxScroll = maxScroll;
print("page number checking right now");
print(page);
fetchMoreData();
}
});
super.initState();
}
void fetchMoreData() async {
await Future.delayed(Duration(seconds: 3));
setState((){
numberOfItems += 100;
});
}
@override
Widget build(BuildContext context) {
return ListView.separated(
controller: _scrollController,itemCount: numberOfItems,itemBuilder: (ctx,index){
return Padding(
padding: EdgeInsets.all(15),child: Text('Item $index'),);
},separatorBuilder: (_,__){
return const SizedBox(height: 2);
}
);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。