Flutter如何创建列表视图自动滚动?

时间:2019-06-20 12:12:16

标签: flutter dart autoscroll flutter-listview

我正在尝试创建一个ListView,它可以自动滚动到最新的数据点。 通过创建使用.jumpTo方法的_scrollToBottom函数,我很累。

但是我在应用程序中出现了黑屏,并且 'child.parentData != null': is not true.在调试控制台中。

关于我如何实现自动滚动的任何建议?

这是我当前代码的相关部分:

ScrollController _scrollController = ScrollController();

_scrollToBottom(){  _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
}

@override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: DataShareWidget.of(context).stream,
      builder: (BuildContext context, AsyncSnapshot snapshot){
        if(snapshot.hasError){ return Text(snapshot.error);}
        if(snapshot.hasData){
          _dataFormat(snapshot.data);
          return ListView.builder(
            itemCount: _listViewData.length,
            controller: _scrollController,
            reverse: true,
            shrinkWrap: true,
            itemBuilder: (context, index) {
              _scrollToBottom();
              return ListTile(
                title: AutoSizeText(_listViewData[index], maxLines: 2),
                dense: true,
              );
            },
          );
        }
      }
    );
  }

3 个答案:

答案 0 :(得分:0)

问题出在您的StreamBuilder代码中。如果快照尚未准备好,则需要返回一些内容。 尝试以下代码:

eas

答案 1 :(得分:0)

列表完全构建后,您需要调用_scrollToBottom()方法。

修改是您的代码(没有StreamBuilder):

      ScrollController _scrollController = ScrollController();;

      _scrollToBottom() {
        _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
      }

      @override
      void initState() {
        super.initState();
      }

      @override
      Widget build(BuildContext context) {
        WidgetsBinding.instance.addPostFrameCallback((_) => _scrollToBottom()); 
        return Scaffold(
          body: ListView.builder(
            itemCount: 50,
           // itemCount: _listViewData.length,
            controller: _scrollController,
            reverse: true,
            shrinkWrap: true,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Yo Dummy Text $index'),
                // title: AutoSizeText(_listViewData[index], maxLines: 2),
                dense: true,
              );
            },
          ),
        );
      }

答案 2 :(得分:0)

您需要执行此操作并使其完美运行。...

  ScrollController _scrollController = ScrollController();
  
  @override
  Widget build(BuildContext context) {
    _scrollController.animateTo(_scrollController.position.maxScrollExtent, duration: Duration(milliseconds: 200), curve: Curves.easeOut);
    return StreamBuilder(
      stream: stream = Firestore.instance
          .collection('your collaction')
          .document('your document')
          .snapshots(),
      builder: (context, snapshot) {
        return snapshot.hasData
            ? ListView.builder(
                controller: _scrollController,
                shrinkWrap: true,
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index) =>
                    msgTile(snapshot.data.documents[index], user1),
              )
            : Text('Loading...');
      },
    );
  }