首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flutter ListView -如何在底部开始滚动

Flutter ListView -如何在底部开始滚动
EN

Stack Overflow用户
提问于 2021-05-09 17:49:18
回答 2查看 104关注 0票数 1

我刚接触Flutter和UI开发,我被卡住了,所以我需要帮助!

我正在尝试用惰性加载/无限滚动在我的应用程序中构建一个视频帖子列表。惰性加载部分似乎工作得很好,但我遇到的问题是,每次加载新视频时,滚动条都会在构建后返回顶部。下面是我的代码:

代码语言:javascript
运行
复制
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

任何想法都将受到高度的感谢!

EN

回答 2

Stack Overflow用户

发布于 2021-05-09 18:56:12

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

更改reverse=true,默认情况下反向为false并选中它。

票数 1
EN

Stack Overflow用户

发布于 2021-05-09 18:03:49

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

代码语言:javascript
运行
复制
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; });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67456334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档