【问题标题】:Flutter ListView - how to start scroll at the bottomFlutter ListView - 如何在底部开始滚动
【发布时间】:2021-07-31 00:35:11
【问题描述】:

我是 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 一起使用。

任何想法都将受到高度赞赏!

【问题讨论】:

标签: flutter flutter-layout lazy-loading infinite-scroll flutter-scrollbar


【解决方案1】:

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

改变反向=真, 默认情况下 reverse 是 false 并检查它。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答。不幸的是,我们不能在那里调用_scrollController.jumpTo(),因为控制器还没有连接到ListView。我收到以下错误:Failed assertion: line 887 pos 12: 'activity!.isScrolling': is not true.
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 2020-07-16
    • 2023-03-26
    • 2021-07-25
    • 2014-05-08
    • 2020-07-13
    • 2012-03-28
    • 2016-11-22
    相关资源
    最近更新 更多