#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();
}