Flutter 颤振列表视图-如何从底部开始滚动

Flutter 颤振列表视图-如何从底部开始滚动,flutter,flutter-layout,lazy-loading,infinite-scroll,flutter-scrollbar,Flutter,Flutter Layout,Lazy Loading,Infinite Scroll,Flutter Scrollbar,一般来说,我对颤振和UI开发是新手,我被卡住了,所以我需要一些帮助 我正试图在我的应用程序中通过延迟加载/无限滚动来构建一个视频帖子列表。延迟加载部分似乎工作得很好,但我遇到的问题是,每次加载新视频时,在构建之后滚动条都会回到顶部。这是我的密码: class _ProfileState extends State<Profile> { Future _videoResponseFuture; ScrollController _scrollController = Scrol

一般来说,我对颤振和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();
                    },
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
class\u ProfileState扩展状态{
未来(反应)未来;;
ScrollController_ScrollController=ScrollController();
UserService _UserService=UserService();
列表_视频=[];
@凌驾
void initState(){
super.initState();
_videoResponseFuture=\u getUserVideos();
_scrollController.addListener((){
如果(_scrollController.position.pixels==
_scrollController.position.maxScrollExtent){
_getMore();
}
});
}
@凌驾
无效处置(){
super.dispose();
_scrollController.dispose();
}
Future\u getUserVideos()异步{
返回_userService.getUserVideos();
}
_getMore(){
设置状态(){
_videoResponseFuture=\u userService.getMoreVideos();
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“标题”),
),
主体:脚手架(
正文:安全区(
孩子:填充(
子:列(
儿童:[
//其他孩子。。。
扩大(
孩子:未来建设者(
未来:\ u视频响应未来,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.done){
如果(_videos.length==0){
_视频=快照.data;
}否则{
List newVideos=snapshot.data;
newVideos.forEach((元素){
_视频。添加(元素);
});
}
返回滚动条(
子项:ListView.builder(
收缩膜:对,
itemCount:_videos.length,
滚动方向:轴垂直,
控制器:\ u滚动控制器,
itemBuilder:(构建上下文,int索引){
返回文本(_videos[index].videoDetails.fileName);
},
),
);
}
返回循环ProgressIndicator();
},
),
),
],
),
),
),
),
);
}
}
我尝试使用
initState
方法中的以下代码使scroll控制器滚动到底部,但它不起作用:
scrollController.jumpTo(scrollController.position.maxScrollExtent)

除了使用
ScrollController
之外,我还尝试了不同的滚动选项,但在
ListView
上似乎没有其他方法可以使用

任何想法都将不胜感激

\u getMore()
方法中,我们可以加载视频,然后滚动到底部。 然而,为了做到这一点,我们需要注意不要创建无限循环。我们可以通过
\u加载
状态变量来实现:

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; });
}

您可以使用listview.builder reverse的属性,这可能有助于解决此问题

更改反向=真,
默认情况下,反向为false并进行检查。

检查此答案,使用keepALive Thank@griffins,我已将其添加到我的代码中,不幸的是,这似乎不会对您的答案产生任何影响。不幸的是,我们无法在那里调用
\u scrollController.jumpTo()
,因为该控制器尚未连接到ListView。我收到以下错误:
断言失败:第887行,位置12:“活动!”!。IsCrolling':不正确。