Не удается создать список избранных не прошедших проверку подлинности пользователей Flutter / Firebase в ListTile - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь создать опцию «выбрать избранную» для пиктограммы пользователя без аутентификации, в которой при щелчке по значку (в списке заголовков данных ListView of Firestore (названий книг)) он сохраняет данные для перенаправления новая страница избранного. Я не могу найти информацию о том, как это сделать, в документации Firestore, но я нашел учебник для YouTube, который делает это для популярного приложения WordPair. Вот строка, используемая для хранения их данных 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');

finalreadySaved = Firestore.instance.collection ("books"). Document ('title');

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 УжеSaved = 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 не определены для типа Функция

1 Ответ

0 голосов
/ 14 февраля 2020

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

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

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

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

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

...