Флаттер добавить товар в список - PullRequest
0 голосов
/ 28 марта 2019

Я хотел бы добавить элемент в список:

void submitAll() async {
List<UserSearchItem> userSearchItems = [];
Firestore.instance
    .collection('insta_users')
    .snapshots()
    .listen((data) =>
    data.documents.forEach((doc){
      print(data.documents.length);

      User user = new User.fromDocument(doc);
      UserSearchItem searchItem = new UserSearchItem(user);
      userSearchItems.add(searchItem);
      print(user.bio);

    }));
print("Loaded");
print(userSearchItems.length);
}

Но если я печатаю длину списка на консоли, он всегда говорит, что список длинен 0 ...

print(userSearchItems.length);

Есть предложения?

С наилучшими пожеланиями

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Я попытаюсь дать объяснение того, что происходит здесь, взгляните на этот код:

import 'dart:async';

void main() {
  List<int> userSearchItems = [];

  Timer _sendTimeOutTimer;

  const oneSec = Duration(seconds: 2);
  _sendTimeOutTimer = Timer.periodic(oneSec, (Timer t) {
    userSearchItems.add(1);
    print(userSearchItems.length); // result 1 and it will be executed after 2 seconds 
    _sendTimeOutTimer.cancel();
  });

  print(userSearchItems.length); // result 0 and it will be executed first
}

Печать внутри асинхронного действия (Таймер) будет выполнена через 2 секунды, значит после асинхронногодействие заканчивается, но то, которое находится за пределами асинхронного действия (Таймер), будет выполнено напрямую, без ожидания 2 секунд, в вашем случае асинхронное действие прослушивает данные .listen((data) =>, поэтому, если вы печатаете длину вне вашего асинхронного действия, выне увидит дефент, потому что элемент еще не добавлен.

Решение: вы можете создать функцию с возвратом Future и затем подождать, пока она не закончится, затем напечатать длину.

List<UserSearchItem> userSearchItems = [];

Future<String> submitAll() async {

Firestore.instance
    .collection('insta_users')
    .snapshots()
    .listen((data) =>
    data.documents.forEach((doc){
      print(data.documents.length);

      User user = new User.fromDocument(doc);
      UserSearchItem searchItem = new UserSearchItem(user);
      userSearchItems.add(searchItem);
      print(user.bio);

      return 'success';
    }));
}

void yourFunction() async{
   await submitAll();
   print("Loaded");
   print(userSearchItems.length);
}

Затем позвоните yourFunction().

1 голос
/ 28 марта 2019

Попробуйте добавить print(userSearchItems.length); внутрь forEach после добавления элемента, и вы увидите реальную длину.

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