Как превратить коллекцию в Firebase в список строк и сделать с ним некоторые условия

Я пытаюсь получить коллекцию в Firebase и превратить ее в список строк и создать с ней некоторые условия. Я создаю приложение для магазина, и я намерен применить способ создания списка избранного для каждого пользователя, когда я нажимаю кнопку в продукте. Чтобы добавить любимый продукт в firebase, я использую это, и он работает:

_saveFavorite(Product product) async {

    await _loadCurrentUser(); //So I get the user ID

    Firestore db = Firestore.instance;
    db.collection("my_favorites")
        .document(_userID)
        .collection("products")
        .document(product.id)
        .setData(product.toMap());
  }

Чтобы удалить любимый продукт, я использую это:

_removeFavorite(String productID) async {
    await _loadCurrentUser();

    Firestore db = Firestore.instance;
    db.collection("my_favorites")
        .document(_userID)
        .collection("products")
        .document(product.id)
        .delete();
  }

Итак, это путь: Коллекция (my_favorites) ›Документ (userID)› Коллекция (продукты) ›Документ (productID)› продукты сохранить как избранные.

Я пытаюсь сохранить все идентификаторы продуктов в коллекции (продукты), чтобы создать условие для выпуклой кнопки, но я не знаю, как это сделать. Я хочу нажать эту кнопку и создать условие вроде: ListOfIDProducts.contains (product.id)? _removeFavorite: _saveFavorite;

Спасибо за внимание, и если вы могли бы мне помочь, я очень ценю это!


person João Pedro    schedule 27.03.2021    source источник


Ответы (1)


Вы можете сохранить такой список внутри документа /my_favorites/USER_ID как массив идентификаторов продуктов, избранных в настоящий момент. Вы можете поддерживать этот список с помощью облачной функции, поскольку каждый продукт добавляется и удаляется из коллекции /my_favorites/USER_ID/products, но, возможно, проще просто использовать пакетная запись вместе с преобразования поля массива, arrayUnion() и arrayRemove().

_saveFavorite(Product product) async {
    await _loadCurrentUser();

    Firestore db = Firestore.instance;
    WriteBatch batch = db.batch();
    // queue adding the product's ID to the products array
    batch.update(
        db.collection("my_favorites")
            .document(_userID),
        {
            products: FieldValue.arrayUnion([product.id])
        }
    );
    // queue uploading a copy of the product's data to this user's favorites
    batch.set(
        db.collection("my_favorites")
            .document(_userID)
            .collection("products")
            .document(product.id),
        product.toMap()
    );
    return batch.commit();
}

_removeFavorite(String productID) async {
    await _loadCurrentUser();

    Firestore db = Firestore.instance;
    WriteBatch batch = db.batch();
    // queue removing product.id from the products array
    batch.update(
        db.collection("my_favorites")
            .document(_userID),
        {
            products: FieldValue.arrayRemove([product.id])
        }
    );
    // queue deleting the copy of /products/PRODUCT_ID in this user's favorites
    batch.delete(
        db.collection("my_favorites")
            .document(_userID),
            .collection("products")
            .document(product.id)
    );
    return batch.commit();
}

Чтобы получить список идентификаторов продуктов, вы должны использовать что-то вроде:

_getFavoriteProductIDs() async {
    await _loadCurrentUser();

    Firestore db = Firestore.instance;
    return db.collection("my_favorites")
        .document(_userID)
        .get()
        .then((querySnapshot) {
            return querySnapshot.exists ? querySnapshot.get("products") : []
        });
}

Вы даже можете преобразовать его для работы со списками:

_saveFavorite(List<Product> products) async {
    if (products.length == 0) {
      return; // no action needed
    }
    
    await _loadCurrentUser();

    Firestore db = Firestore.instance;
    WriteBatch batch = db.batch();
    // queue adding each product's ID to the products array
    batch.update(
        db.collection("my_favorites")
            .document(_userID),
        {
            products: FieldValue.arrayUnion(
                products.map((product) => product.id).toList()
            )
        }
    );
    // queue uploading a copy of each product to this user's favorites
    for (var product in products) {
        batch.set(
            db.collection("my_favorites")
                .document(_userID)
                .collection("products")
                .document(product.id),
            product.toMap()
        );
    }
    return batch.commit();
}

_removeFavorite(List<String> productIDs) async {
    if (productIDs.length == 0) {
      return; // no action needed
    }
    
    await _loadCurrentUser();

    Firestore db = Firestore.instance;
    WriteBatch batch = db.batch();
    // queue removing each product ID from the products array
    batch.update(
        db.collection("my_favorites")
            .document(_userID),
        {
            products: FieldValue.arrayRemove(productIDs)
        }
    );
    // queue deleting the copy of each product in this user's favorites
    for (var product in products) {
        batch.delete(
            db.collection("my_favorites")
                .document(_userID)
                .collection("products")
                .document(product.id)
        );
    }
    return batch.commit();
}

Дополнительное примечание: в соответствии с вашей текущей реализацией избранный продукт копируется из /products/PRODUCT_ID в /my_favorites/USER_ID/products/PRODUCT_ID. Помните, что с этой структурой, если /products/PRODUCT_ID когда-либо обновляется, вам придется обновлять каждую копию этого продукта. Я предлагаю переименовать products в favorited-products, чтобы вы могли добиться этого с помощью облачной функции и запрос группы сбора ( см. этот ответ для получения дополнительной информации).

person samthecodingman    schedule 27.03.2021