Как сохранить Список типов карт в firestore, а затем читать / писать на созданные карты? - PullRequest
0 голосов
/ 31 марта 2020

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

Моя Проблема в том, что я создал Список типа Карта , но не могу понять, как добавить и сохранить в списки, которые созданы на картах.

Модель

class Cards {
  //final List<String> question;
  //final List<String> answer;
  //final String title;  
  final String uid;
  final List<Map<String, dynamic>> classes;

  Cards({ this.uid, this.classes });

}

Домашняя страница

Именно здесь она начинается, elList.add запускается только один раз, когда пользователь создает заголовок.

  Cards indexData = snapshot.data;
 List<Map<String, dynamic>> elList = [];

      for (var i = 0; i < indexData.classes.length; i++) {
           elList.add(indexData.classes[i]);
          }

elList.add({
   "title": title,
   "question": [],
   "answer": [] 
  });                   
    DatabaseService(uid: userId.uid).settingUserData(elList);

  // Send the values to another screen where the user creates Q&A
 MaterialPageRoute(
          builder: (context) => ViewIndex(                                                                                             
          questions: elList[index]["question"],
          answers: elList[index]["answer"]
                                        ),
                                      ),    

Служба

Именно здесь она сохраняется в БД. Моя проблема здесь заключается в попытке выяснить, как добавить в списки внутри карты, потому что это только добавляет в список классы , который индексирует все карты. Это выполняется при создании заголовка. Пытаетесь выяснить, как добавить в списки внутри карты и сохранить их? Я пробовал что-то вроде: "classes [question]" и "classes.question", но ни одна из них не работает.

 Future settingUserData(List<Map<String, dynamic>> listCard) async {
    return await _collref.document(uid).setData({  
      "classes": listCard
      });
  }

ViewIndex

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

widget.answers.add("foo")
widget.questions.add("foo")



 DatabaseService(uid: userId.uid).settingUserData();

Ответы [ 2 ]

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

Не могу поверить, что я этого не заметил ... Но все, что мне нужно было сделать, это добавить переданные аргументы из дома для просмотра индекса И затем переместить их в массив и l oop через них

ViewIndex

                 List<dynamic> userAnswer = [];
                 List<dynamic> userQuestion = [];
                for (var i = 0; i < widget.questions.length; i++) {
                  userQuestion.add(widget.questions[i]);
                }
                for (var i = 0; i < widget.answers.length; i++) {
                  userAnswer.add(widget.answers[i]);
                }   

   DatabaseService(uid: userId.uid)
            .updattingUserData(widget.index, userQuestion, userAnswer);

Сервис

Здесь я затем использовал точечную запись для чтения и записи в указанный список c на картах. Мне также нужно было пройти индекс, чтобы узнать, к какому из них я пишу. Я сделал отдельную функцию для этого. Причина, по которой это была фиксированная длина, заключалась в том, что у меня ее не было в списке.

Future updattingUserData(int index, List<dynamic> question, List<dynamic> answer) async {
    return await _collref.document(uid).updateData({
      "classes.$index.questions": FieldValue.arrayUnion(question),
      "classes.$index.answers": FieldValue.arrayUnion(answer)
   });
  }

Все остальное точно так же, как и в моем первом посте.

0 голосов
/ 31 марта 2020

Я думаю, что лучшим решением для вас является определение другого класса для ваших классов в качестве модели, который станет

class Cards {
  //final List<String> question;
  //final List<String> answer;
  //final String title;  
  final String uid;
  final List<YourClass> classes;

  Cards(this.uid, this.classes);
}

class YourClass {
  final Map<String, dynamic> yourObject;
  YourClass(this.yourObject);
}

Затем инициализируйте ваш класс нужным вам объектом и назначьте его вашим картам.

  List<YourClass> classes = List<YourClass>();
  Map<String, dynamic> myItem = jsonDecode('{"hello": "dart","world": {"json": "blabla"}}');

  // create your classItem
  YourClass class1 = YourClass(myItem);

  // add your classItem to a your classes list
  classes.add(class1);

  // add your classes to your card
  Cards card = Cards('myUid', classes);
  print(jsonEncode(card.classes[0].yourObject['hello']));

поиграйте здесь: пример

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