#flutter #dart #snapshot
#флаттер #dart #снимок
Вопрос:
Я получаю ошибку type 'List<dynamic>' is not a subtype of type 'String'
Ошибка указывает на return ChatRoomTile(snapshot.data.documents[index].data['participants']);
Может кто-нибудь сказать мне, что здесь происходит?
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: header(context, strTitle: "Messages",),
body: StreamBuilder(
stream: Firestore.instance.collection('/UserChats').where('participants',arrayContains: currentUser.receiverName).snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
if(snapshot.hasData){
return ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (BuildContext context, int index) {
return ChatRoomTile(snapshot.data.documents[index].data['participants']);
//Text(snapshot.data.documents[index].documentID);
},
);
}else{return Text("Loading/Error");}
},
),
//getChatRooms(),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.search),
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => SearchChat()));
}
),
);
}
}
Ответ №1:
Мне кажется, что snapshot.data.documents[index].data['participants']
это List
и конструктор ChatRoomTile
принимает только String
. Если я прав, это список только с одним элементом, попробуйте получить самый первый элемент списка:
ChatRoomTile((snapshot.data.documents[index].data['participants'] as List<String>).first);
Комментарии:
1. Я попытался добавить . toString(); до конца участников, и это сработало! Я также собираюсь попробовать этот метод и посмотреть, что произойдет. Спасибо!
2. @Indigo, также попробуйте отладить то, что у вас внутри
snapshot.data.documents[index].data['participants']
, чтобы убедиться, что у вас есть только один элемент для обработки. Вы даже можетеprint(snapshot.data.documents[index].data['participants']);
прямо передreturn ChatRoomTile...
Ответ №2:
Попробуйте включить тип данных, ожидаемых StreamBuilder, объявив его с типом, который выдает поток, вот так:
StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('/UserChats').where('participants',arrayContains: currentUser.receiverName).snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
if(snapshot.hasData){
// rest
}else{return Text("Loading/Error");}
},
),
И тогда это зависит от того, что вы хотите отобразить в ChatroomTile. Как говорит Owczar, ChatroomTile принимает строку в качестве аргумента.
Комментарии:
1. Итак, я попробовал это, и я получил тип аргумента ‘Stream<QuerySnapshot>’, который не может быть присвоен типу параметра ‘Stream<List<String>>’.