Флаттер |Проверьте, существуют ли документы в Firebase и вернитесь согласно значку - PullRequest
0 голосов
/ 27 апреля 2019

Я хочу проверить, существует ли конкретный документ в коллекции Firebase.В соответствии с этим мое приложение должно отображать цветной значок или серый.Я пытаюсь решить проблему с помощью метода, который возвращает bool.В моем виджете сборки я вызываю этот метод и назначаю правильный значок.

Вот мой метод, который проверяет, существует ли документ:

checkIfLikedOrNot(reference) async{
   DocumentSnapshot ds = await reference.collection("likes").document(currentUser.uid).get();
   print(ds.exists);
   return ds.exists;
}

На распечатке показаноправильные значения в консоли, но мой виджет сборки, похоже, игнорирует тот факт, что bool имеет значение true и всегда возвращает значок, который должен отображаться, если в коллекции нет документа.

Здесьчасть моего виджета сборки:

 GestureDetector(
                  child: checkIfLikedOrNot(list[index].reference) == true

                  ? 
                     Icon(
                      Icons.favorite,
                      color: Colors.red,
                     )
                  : 
                     Icon(
                     FontAwesomeIcons.heart,
                     color: null,
                     ),
    )

Где проблема с этим утверждением?Есть идеи?

С уважением.

1 Ответ

1 голос
/ 27 апреля 2019

В зависимости от вашего варианта использования вы можете либо использовать FutureBuilder , либо оставить его простым и создать переменную для работы с логикой:

Внутри вашего виджета:

bool isLiked = false;

Вызовите вашу функцию из initState ():

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

Измените свою логику, чтобы изменить переменную, и скажите Flutter перерисовать:

    checkIfLikedOrNot() async{
       DocumentSnapshot ds = await reference.collection("likes").document(currentUser.uid).get();
        this.setState(() {
          isLiked = ds.exists;
        });

    }

Нарисуйте соответствующую иконку:

Icon(isLiked?Icons.favorite:FontAwesomeIcons.heart,
     color: isLiked?Colors.red:null)

Редактировать: Поскольку вы, очевидно, имеете дело со списком значений, имеет смысл инкапсулировать их в объект или использовать FutureBuilder.

...