Streambuilder отображает виджет по умолчанию вместо данных, возвращаемых построителем
У меня есть конструктор потоков, который должен отображать такие контакты. Функция извлекает необходимые данные, как указано функциями печати, однако они не отображаются на экране, почему?
static Future<Map<String, String>> getUserBasicInfo(String userID) async // How I retrieve basic info
{
QuerySnapshot userDatabase = await FirebaseFirestore.instance.collection('users').where('userID', isEqualTo: userID).get();
final List<DocumentSnapshot> userSnapshot = userDatabase.docs;
Map<String, String> userInfo = {
'photoURL' : userSnapshot[0].data()['photoURL'].toString(),
'username' : userSnapshot[0].data()['username'].toString()
};
return userInfo;
}
Stream<List<ChatUsers>> _getConvos1() async* { // The function called in the builder
List<ChatUsers> retrievedContacts = [];
print('0');
Map basicInfo = Map<String, String>();
FirebaseFirestore.instance
.collection('messages')
.where('users', arrayContains: FirebaseAuth.instance.currentUser.uid)
.snapshots()
.listen((element) {
element.docs.forEach((document) async {
print(document.data());
print('1');
String contactID = (document.data()['senderID'] ==
FirebaseAuth.instance.currentUser.uid
? document.data()['lastMessage']['receiverID']
: document.data()['lastMessage']['senderID']);
print("ContactID: " + contactID);
print('2');
basicInfo = await UserDatabase.getUserBasicInfo(contactID);
print("BasicInfo: " + basicInfo.toString());
print('3');
String content = document.data()['lastMessage']['content'];
print('4');
String time = (new DateTime.fromMillisecondsSinceEpoch(
int.parse(document.data()['lastMessage']['time']) * 1000))
.toString();
print('5');
Map lastMessageInfo = Map<String, String>();
lastMessageInfo = {'content': content, 'time': time};
print('6');
Map<String, String> combinedMap = {...basicInfo, ...lastMessageInfo};
print('7');
ChatUsers newUser = ChatUsers(
combinedMap['username'],
combinedMap['content'],
combinedMap['photoURL'],
combinedMap['time']);
print('8');
print(newUser.userName.toString() +
" " +
newUser.userImageURL.toString() +
" " +
newUser.messageText.toString() +
" " +
newUser.time.toString());
retrievedContacts.add(newUser);
print('9');
});
print('10');
});
print('11');
yield retrievedContacts;
}
////////////////////////////////////////////////////////////////////////////////////
Container(
child: StreamBuilder(
stream: _getConvos1(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
Widget displayWidget = Container(
);
if (snapshot.hasError) {
displayWidget = Container(
width: 200,
height: 200,
child: Text("Error: " + snapshot.error.toString()));
} else {
if (snapshot.connectionState == ConnectionState.none) {
displayWidget = Container(
width: 200, height: 200, child: Text("None"));
} else if (snapshot.connectionState ==
ConnectionState.waiting) {
displayWidget = Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height - 250,
child: Align(
alignment: Alignment.center,
child: CircularProgressIndicator(
valueColor:
AlwaysStoppedAnimation(Colors.black),
)),
);
} else if (snapshot.connectionState ==
ConnectionState.active) {
displayWidget = ListView.builder(
itemCount: snapshot.data.length,
shrinkWrap: true,
padding: EdgeInsets.only(top: 16),
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
print("Username: " +
snapshot.data[index].userName);
return Conversation(
userName: snapshot.data[index].userName,
messageText: snapshot.data[index].messageText,
userImageURL:
snapshot.data[index].userImageURL,
time: snapshot.data[index].time,
messageRead:
(index == 0 || index == 3) ? true : false,
);
});
}
}
return displayWidget;
}))
Вместо этого он просто отображает пустой контейнер по умолчанию. В некотором смысле он показывает круговой индикатор на несколько мгновений, после того как функция _getConvos1 загружает необходимые данные - индикатор исчезает и вместо него отображается пустой контейнер, что странно. Когда я удаляю контейнер по умолчанию, появляется сообщение об ошибке, сообщающее, что строитель вернул значение null. Как это выглядит. Может быть, будущее в getUserBasicInfo(String userID) вызывает проблемы?