Проблема с загрузкой данных из firestore в список с флаттером - PullRequest
1 голос
/ 09 мая 2019

Документ Firestore содержит определенную информацию о пользователе (имя пользователя, возраст, проблемы и т. Д.). Конечно, у одного пользователя может быть несколько проблем. Я загружаю определенные пользовательские данные в список объектов, но проблема возникает, когда я возвращаю этот список в FutureBuilder. Допустим, у меня есть 2 пользователя, и у каждого есть 3 проблемы. Когда я возвращаю список, он показывает правильную длину (6), но содержит только данные от последнего пользователя, который был загружен в список. Мой ListView.builder отображает 6 _cardBuilders, но данные на этих картах одинаковы.

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

Future<List<AllChallengesStorage>> challengesToFeed () async {

    var queryResult = await Firestore.instance.collection("Users")
        .where("total_challenges", isGreaterThanOrEqualTo: 1)
        .getDocuments();

    if (queryResult.documents.isNotEmpty){  

      for (int i=0; i < queryResult.documents.length; ++i){
        for (int j=0; j < queryResult.documents[i].data['total_challenges']; ++j){

          widget.challengesInfo.username = queryResult.documents[i].data['username'];
          widget.challengesInfo.name = queryResult.documents[i].data['challenges'][j]['name'];
          widget.challengesInfo.description = queryResult.documents[i].data['challenges'][j]['description'];
          widget.challengesInfo.duration = queryResult.documents[i].data['challenges'][j]['duration'];

          allChallenges.add(widget.challengesInfo);
        }
      }
    }
    return allChallenges;
  }


class _FeedState extends State<Feed> {

  List<AllChallengesStorage> allChallenges = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<List<AllChallengesStorage>>(
        future: challengesToFeed(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (!snapshot.hasData) return Center(child: Text("Loading..."));
          return ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (BuildContext context, int index) {
              return _cardBuilder(context, snapshot, index);
            },
          );
        },
      ),
    );
  }

1 Ответ

0 голосов
/ 09 мая 2019

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

    for (int i=0; i < queryResult.documents.length; ++i){
       ClassName helper = ClassName();
    for (int j=0; j < queryResult.documents[i].data['total_challenges']; ++j){

      helper.username = queryResult.documents[i].data['username'];
      helper.name = queryResult.documents[i].data['challenges'][j]['name'];
      helper.description = queryResult.documents[i].data['challenges'][j]['description'];
      helper.duration = queryResult.documents[i].data['challenges'][j]['duration'];

      allChallenges.add(helper);
    }
  }
}

Затем, чтобы получить доступ к объектам в списке, вы можете указать индекс и получить доступ к объекту по этому индексу и его свойствам

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