Невозможно создать список избранных пользователей Flutter / Firebase без аутентификации в ListTile

Я пытаюсь создать параметр `` выбрать избранное '' значка НЕАутентифицированного пользователя, где, если щелкнуть значок (в списке заголовков в ListView данных Firestore (заголовки книг)), он сохраняет данные, которые будут перенаправлены в новое избранное страница. Я не могу найти информацию о том, как это сделать, в документации Firestore, но я нашел учебник на YouTube, который делает это для популярного приложения WordPair flutter. Вот строка, используемая для хранения их данных WordPair:

final _randomWordPairs = <WordPair>[];

и еще одна переменная, чтобы проверить, были ли уже сохранены списки WordPair:

final _savedWordPairs = Set<WordPair>[];

Если моя строка данных Firebase

Firestore.instance.collection("titles").snapshots()

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

snapshot.data.documents[index]['title']

Ничего не работает. Все еще пытаюсь разобраться: переменные:

final savedDb = Firestore.instance.collection("books").document('title');

final ужеSaved = Firestore.instance.collection ("книги"). документ ('название');

Код ListTile для его вызова:

trailing: Icon( alreadySaved ?  Icons.favorite :
                        Icons.favorite_border,
                        color: alreadySaved ? Colors.red : null),

                          onTap: () {
                          setState(() {
                            if(alreadySaved) {
                              savedDb.remove('title');
                            }else{
                              savedDb.add('title');
                            }
                          });
                        }

Я пробовал это, но теперь эта страница просто вылетает;

final alreadySaved = Firestore.instance.collection("books").where((item) => item.contains("title"));

List<String> savedDb = ['Firestore.instance.collection("books").document(title)'];

                              trailing: Icon( alreadySaved == null ?  Icons.favorite :
                          Icons.favorite_border,
                              color: alreadySaved != null ? Colors.red : null),

                          onTap: () {
                            setState(() {
                              savedDb.add('title');
                            });
                          },

Последняя попытка:

bool alreadySaved = false;

savedDb() async{
    DocumentSnapshot ds = await         
Firestore.instance.collection("books").document('title').get();
    this.setState(() {
      alreadySaved = ds.exists;
    });
  }

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

а onTap говорит, что .remove и .add не определены для типа Function, и мои значки даже не меняют цвет. Это невозможно

                            onTap: () {
                          setState(() {
                            if(alreadySaved) {
                              savedDb.remove('Firestore.instance.collection("books")');
                            }else{
                              savedDb.add(Firestore.instance.collection("books"));
                            }
                          });
                        },

Возвращает .remove, а .add не определен для типа Function.


person Mark    schedule 13.02.2020    source источник
comment
Не могли бы вы добавить что-нибудь об этом, т.к. вам сложно понять вашу проблему, и я не знаю, чего вы хотите достичь. Можете поделиться ссылкой на учебник? Что вы имеете в виду под эквивалентом?   -  person vitooh    schedule 13.02.2020
comment
Да, в учебнике по флаттеру на сайте   -  person Mark    schedule 13.02.2020


Ответы (1)


Всю информацию о типах данных в Firestore вы можете найти в этом документе .

Для _randomWordPairs, который на самом деле является массивом, вы можете просто использовать тот же тип. Массив - это один из поддерживаемых типов полей в Firestore. Так что с этим не должно быть никаких проблем.

Когда дело доходит до _savedWordPairs, все сложнее, так как это набор, что означает, что он не может содержать повторяющиеся значения. Таким образом, во время обновления поля, содержащего этот список, вы должны добавить логику, которая будет проверять, существует ли уже конкретное значение перед добавлением в список.

Конечно, нет возможности хранить WordPair настраиваемого типа в Firestore, но вы можете сохранить его строковый объект, и есть много возможностей для этого: как список, как карта или просто как String или даже как некоторый вложенный объект. Firestore - это, как правило, база данных NoSQL, основанная на документах, поэтому вы можете делать в ней все. Если вам нужна дополнительная информация о модели данных Firestore, проверьте здесь. Или просто взгляните на общую ссылку на «NoSQL на основе базы данных документов», поскольку Firestore реализует все стандартные концепции этих типов db.

Надеюсь, это поможет!

person vitooh    schedule 14.02.2020
comment
Я просто не могу этого понять. В этих документах мне ничего не ясно о том, как добавить логику, чтобы увидеть, существует ли уже значение. '.contains', '.exists', ничего не работает. Я обновил свой код выше, чтобы включить мою переменную и метод firestore, и ошибки: «Условия должны иметь определенный тип bool» и «метод .add не определен». Я также пробовал .set и .get. Я просмотрел dart.dev/tools/diagnostic-messages#non_bool_condition, но я просто могу непонятна. Это намного выше моего уровня навыков, но это видео было таким простым для пар слов. - person Mark; 14.02.2020
comment
Кто-нибудь знает, где я могу найти эксперта по флаттеру в пожарном магазине, который поможет мне разобраться в этом, чтобы я мог это понять? - person Mark; 17.02.2020
comment
Какой пакет вы используете для подключения к firebase? - person vitooh; 20.02.2020
comment
Вы имеете в виду содержимое базы данных? Что еще есть пакет? - person Mark; 20.02.2020
comment
Я имел в виду, что у вас есть в операторах импорта вашего проекта? - person vitooh; 24.02.2020