Оператор If для изменения цвета значка в QuerySnapshot Flutter

#flutter #dart #google-cloud-firestore

#flutter #dart #google-облако-firestore

Вопрос:

Это мой предыдущий код:

 new StreamBuilder<QuerySnapshot>(
                      stream: moodStream,
                      builder: (context, moodQuerySnapshot) =>
                          !moodQuerySnapshot.hasData
                              ? Text('Loading data... Please Wait')
                              : StreamBuilder<QuerySnapshot>(
                                  stream: activityStream,
                                  builder: (context, activityQuerySnapshot) =>
                                      !activityQuerySnapshot.hasData
                                          ? Text('Loading data... Please Wait')
                                          : StreamBuilder<QuerySnapshot>(
                                              stream: feelingStream,
                                              builder: (context,
                                                      feelingQuerySnapshot) =>
                                                  !feelingQuerySnapshot.hasData
                                                      ? Text(
                                                          'Loading data... Please Wait')
                                                      : Container(
                                                          height: 100.0,
                                                          child: new ListView(
                                                            scrollDirection:
                                                                Axis.horizontal,
                                                            children: [
                                                              ...moodQuerySnapshot
                                                                  .data.docs,
                                                              ...activityQuerySnapshot
                                                                  .data.docs,
                                                              ...feelingQuerySnapshot
                                                                  .data.docs,
                                                            ]
                                                                .where((queryDocSnapshot) =>
                                                                    queryDocSnapshot
                                                                            .data()[
                                                                        'display'])
                                                                .map(
                                                                  (queryDocSnapshot) =>
                                                                      Positioned(
                                                                    child:
                                                                        MoodButton(
                                                                      onTap:
                                                                          () {},
                                                                      colourData:
                                                                          Colors
                                                                              .purple,
                                                                      iconData:
                                                                          IconData(
                                                                        queryDocSnapshot
                                                                            .data()['ref'],
                                                                        fontFamily:
                                                                            'MaterialIcons',
                                                                      ),
                                                                    ),
                                                                  ),
                                                                )
                                                                .toList(),
                                                          ),
                                                        ),
                                            ),
                                ),
                    )
 

В .where((queryDocSnapshot) => queryDocSnapshot.data()['display']).map((queryDocSnapshot) => я пытаюсь добавить оператор if только для одного из QuerySnapshot.

Я хочу изменить цвет каждого значка в feelingStream зависимости от colour поля в cloud firestore, но оставить все остальные значки фиолетовыми, в соответствии с этим:

 if (feelingQuerySnapshot.data()["colour"] == "green"){
       // print the icons coloured green
   } else if (feelingQuerySnapshot.data()["colour"] == "red"){
       // print the icons coloured red
   } else {
       // print the icons normally
   }
}
 

Однако, когда я это делаю feelingQuerySnapshot.data()["colour"] , я получаю сообщение об ошибке The expression doesn't evaluate to a function, so it can't be invoked.

РЕДАКТИРОВАТЬ Я изменил свой код на:

 .where((queryDocSnapshot) =>queryDocSnapshot.data()['display']).map((queryDocSnapshot) {
    if (queryDocSnapshot.data()['colour'] == "green") {
        Positioned(
           child:MoodButton(
               onTap:() {},
               colourData: Colors.green,
               iconData: IconData(queryDocSnapshot.data()['ref'],
           ),
        ),
    );
} else if (queryDocSnapshot.data()['colour'] == "red") {
        Positioned(
           child:MoodButton(
               onTap:() {},
               colourData: Colors.red,
               iconData: IconData(queryDocSnapshot.data()['ref'],
           ),
        ),
    );
} else if (queryDocSnapshot.data()['colour'] == "purple") {
        Positioned(
           child:MoodButton(
               onTap:() {},
               colourData: Colors.purple,
               iconData: IconData(queryDocSnapshot.data()['ref'],
           ),
        ),
    );
}
 

Однако ни один из значков не отображается, хотя печать queryDocSnapshot.data()['colour'] возвращает цвета в терминале. Я получаю Null check operator used on a null value и NoSuchMethodError: The getter 'key' was called on null.
Я не уверен, как это решить, поэтому буду признателен за любую помощь!

Комментарии:

1. Вы пробовали feelingQuerySnapshot.data["colour"] ? (без круглых скобок)

2. @AugustinR да, это выдает ошибку The operator '[]' isn't defined for the type 'Map<String, dynamic> Function()'.

Ответ №1:

Включите последний оператор else, который возвращает только контейнер типа:

 else {
    return Container();
}