Как продолжать получать 2 документа в облачном хранилище одним нажатием кнопки? - PullRequest
0 голосов
/ 15 апреля 2020

Это моя база данных:

enter image description here

Я хочу продолжать получать 2 документа в списке одним нажатием кнопки, я пробовал этот код, но это не сработало. Как при

1-м клике, выборка doc_0 и doc_1,

2-й клик, выборка doc_2 и doc_3, и так далее, и так далее.

class _FetchState extends State<Fetch> {
  final List<DocumentSnapshot> _list = [];
  DocumentSnapshot _lastDoc;

  void _fetch() async {
    Firestore.instance.collection("collection")
        .limit(2)
        .startAtDocument(_lastDoc)
        .snapshots()
        .listen((snapshot) {
          _list.addAll(snapshot.documents);
          _lastDoc = _list.last;
          print("length = ${_list.length}");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(onPressed: _fetch),
    );
  }
}

Ответы [ 3 ]

3 голосов
/ 17 апреля 2020

То, что вы ищете, называется Firestore Pagination in Flutter. Обычно вам нужно вызвать первую страницу без startAtDocument один раз, затем сохранить last_document_reference, а затем начать использовать startAtDocument для всех остальных страниц с обновлением last_document_reference. Вы можете увидеть пример здесь

РЕДАКТИРОВАТЬ: Вот часть вашего кода, измененная на то, что вам нужно:

void _fetch() async {
  if(_lastDoc == null) {
    Firestore.instance.collection("collection")
        .orderBy("name") //you can change the key "name" to whatever field key you have
        .limit(2)
        .snapshots()
        .listen((snapshot) {
          _list.addAll(snapshot.documents);
          _lastDoc = _list.last;
          print("length = ${_list.length}");
    });
  }
  else {
    Firestore.instance.collection("collection")
        .orderBy("name") //you can change the key "name" to whatever field key you have
        .startAtDocument(_lastDoc)
        .limit(2)
        .snapshots()
        .listen((snapshot) {
          _list.addAll(snapshot.documents);
          _lastDoc = _list.last;
          print("length = ${_list.length}");
    });
  }
}

Примечание 1: Вы должны управлять этими слушателями! С каждым звонком вы будете создавать новых слушателей, которыми вы должны как-то управлять. Говорить об этом здесь нецелесообразно. А в случае обновления документов вы должны соответственно управлять триггером.

Примечание 2: Вы должны использовать setState((){ _list.addAll(snapshot.documents) }); для обновления сборки (или использовать другие средства для этого) .

Редактировать 2: Думая об этом, вам нужен только прослушиватель для новых сообщений, но старые должны быть фиксированными данными без каких-либо изменений (без редактирования или удаления); Итак, вторая часть без слушателей:

  else {
    Firestore.instance.collection("collection")
        .orderBy("name") //you can change the key "name" to whatever field key you have
        .startAtDocument(_lastDoc)
        .limit(2)
        .getDocuments()
        .then((snapshot) {
          _list.addAll(snapshot.documents);
          _lastDoc = _list.last;
          print("length = ${_list.length}");
    });
  }

Я не тестировал код, но он должен быть примерно таким. Теперь у вас есть только один слушатель, который должен обновляться с новыми документами. Возможно, вам все равно придется обрабатывать изменения.

2 голосов
/ 18 апреля 2020

Я думаю, что это можно решить всего лишь двумя очень простыми шагами, не меняя большую часть вашего кода,

  1. Добавьте поле в ваш do c для сортировки элементов (строка, int или отметка времени).
  2. Затем в вашем собственном коде просто добавьте orderBy (yourValue).

Вот и все!

0 голосов
/ 20 апреля 2020

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

Инициализируйте переменную button_clicks = 0;

Когда нажата кнопка, попробуйте получить файл с именем file_0 а затем, увеличив значение нашей переменной, получите file_1.

Что-то вроде:

// on button click:
{
fetch_file('file_'+button_clicks);  //Function which fetches file_0.. The firestore instance code..
button_clicks++ ; //Increment in variable.
fetch_file('file_'+button_clicks);  //Function which fetches file_1
button_clicks++ ; //Increment in variable.
}

Теперь, когда вы в следующий раз нажмете кнопку, то же самое начнется с file_2, потому что ваша переменная button_clicks = 2.

Я бы настоятельно рекомендовал хранить это значение где-то в firebase-realtime-database отдельно для каждого пользователя или в соответствии с вашими потребностями, если вы хотите, чтобы пользователь загружал из file_0 при перезапуске приложения.

Этот лог c должен помочь. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...