Флаттер, как создать автопрокрутку представления списка? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь создать ListView, который автоматически прокручивается до самой новой точки данных. Я устал делать это, делая функцию _scrollToBottom, которая использует метод .jumpTo.

Но я получаю пустой экран в приложении, и '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,
              );
            },
          );
        }
      }
    );
  }

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Вам нужно вызвать метод _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,
              );
            },
          ),
        );
      }
0 голосов
/ 20 июня 2019

Проблема в вашем коде StreamBuilder. Если снимок не готов, вам нужно что-то вернуть. Попробуйте этот код:

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,
              );
            },
          );
        }
        //Something waiting the snapshot
        return CircularProgressIndicator();
      }
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...