Flutter ListView - как начать прокрутку внизу
Я новичок в разработке Flutter и пользовательского интерфейса в целом, и я застрял, поэтому мне нужна помощь!
Я пытаюсь создать список видеопостов в своем приложении с ленивой загрузкой / бесконечной прокруткой. Часть ленивой загрузки, похоже, работает нормально, но проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда загружаются новые видео, прокрутка возвращается наверх после сборки. Вот мой код:
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
.
Любые идеи будут высоко оценены!
2 ответа
вы можете использовать свойство listview.builder reverse, которое может помочь в этом вопросе
измените reverse = true, по умолчанию reverse false и проверьте это.
в
_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; });
}