Flutter / Firestore: Как добавить элементы в поток при прокрутке (сохранить положение прокрутки после завершения выборки)? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть чат (ListView) с сообщениями, которые я хочу загружать только по мере необходимости.

Поэтому, когда чат загружается изначально, я хочу загрузить последние n сообщений, и когда пользователь прокручивает вверх Я хочу получить старые сообщения также.

Всякий раз, когда в коллекцию Firebase поступает новое сообщение, оно должно быть добавлено в ListView. Я добился этого с помощью StreamBuilder, который принимает поток последних n сообщений, где n - это переменная, хранящаяся в состоянии, которое я могу увеличить для загрузки большего количества сообщений (это аргумент функции, которая получает поток последних n сообщений).

Но с моей текущей реализацией проблема заключается в том, что, хотя при просмотре списка все сообщения выбираются и добавляются в просмотр списка, он сразу же возвращается назад (потому что просмотр списка перестраивается и положение прокрутки не сохраняется). Как я могу предотвратить это?

1 Ответ

1 голос
/ 04 марта 2020

Эта проблема не связана с ListView или позицией прокрутки. Те хранятся с автоматически. Проблема должна быть где-то еще в вашем коде. Посмотрите мой пример ниже, чтобы увидеть, как наличие списка, добавление новых элементов и его сброс, сохранит положение прокрутки или переместится в нужное место:

class ListViewStream60521383 extends StatefulWidget {
  @override
  _ListViewStream60521383State createState() => _ListViewStream60521383State();
}

class _ListViewStream60521383State extends State<ListViewStream60521383> {
  List<String> _itemList;

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


  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Expanded(
          child: ListView.builder(
            reverse: true,
            itemCount: _itemList.length,
            itemBuilder: (context, index){
              return Container(
                height: 40,
                child: Text(_itemList[index]),
              );
            },
          ),
        ),
        Row(
          children: <Widget>[
            RaisedButton(
              onPressed: addMoreItems,
              child: Text('Add items'),
            ),
            RaisedButton(
              onPressed: resetItems,
              child: Text('Reset items'),
            )
          ],
        )
      ],
    );
  }

  void addMoreItems(){
    int _currentListCount = _itemList.length;
    setState(() {
      _itemList.addAll(List.generate(60, (index) => 'item ${index + _currentListCount}'));
    });
  }

  void resetItems(){
    setState(() {
      _itemList = List.generate(60, (index) => 'item $index');
    });
  }
}
...