我刚接触Flutter和UI开发,我被卡住了,所以我需要帮助!
我正在尝试用惰性加载/无限滚动在我的应用程序中构建一个视频帖子列表。惰性加载部分似乎工作得很好,但我遇到的问题是,每次加载新视频时,滚动条都会在构建后返回顶部。下面是我的代码:
class _ProfileState extends State<Profile> {
Future _videoResponseFuture;
ScrollController _scrollController = ScrollController();
UserService _userService = UserService();
List<VideoResponse> _videos = [];
@override
void initState() {
super.initState();
_videoResponseFuture = _getUserVideos();
_scrollController.addListener(() {
if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
_getMore();
}
});
}
@override
void dispose() {
super.dispose();
_scrollController.dispose();
}
Future<List<VideoResponse>> _getUserVideos() async {
return _userService.getUserVideos();
}
_getMore() {
setState(() {
_videoResponseFuture = _userService.getMoreVideos();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
),
body: Scaffold(
body: SafeArea(
child: Padding(
child: Column(
children: <Widget>[
// Other children...
Expanded(
child: FutureBuilder(
future: _videoResponseFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (_videos.length == 0) {
_videos = snapshot.data;
} else {
List<VideoResponse> newVideos = snapshot.data;
newVideos.forEach((element) {
_videos.add(element);
});
}
return Scrollbar(
child: ListView.builder(
shrinkWrap: true,
itemCount: _videos.length,
scrollDirection: Axis.vertical,
controller: _scrollController,
itemBuilder: (BuildContext context, int index) {
return Text(_videos[index].videoDetails.fileName);
},
),
);
}
return CircularProgressIndicator();
},
),
),
],
),
),
),
),
);
}
}
我尝试使用initState
方法中的以下代码让滚动控制器滚动到底部,但不起作用:scrollController.jumpTo(scrollController.position.maxScrollExtent);
我也尝试过使用ScrollController
的不同滚动选项,但似乎没有其他方法适用于ListView
。
任何想法都将受到高度的感谢!
发布于 2021-05-09 18:56:12
您可以使用listview.builder reverse的属性,这可能有助于解决此问题
更改reverse=true,默认情况下反向为false并选中它。
发布于 2021-05-09 18:03:49
在_getMore()
方法中,我们可以加载视频,然后滚动到底部。然而,为了做到这一点,我们需要注意不要创建无限循环。我们可以通过_loading
状态变量来做到这一点:
bool _loading = false;
@override
void initState() {
super.initState();
_videoResponseFuture = _getUserVideos();
_scrollController.addListener(() {
if (!_loading &&
_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent) {
_getMore();
}
});
}
_getMore() {
setState(() {
_loading = true;
await _userService.getMoreVideos();
});
await _scrollController.jumpTo(scrollController.position.maxScrollExtent);
setState(() { _loading = false; });
}
https://stackoverflow.com/questions/67456334
复制相似问题