тип ‘Список’ не является подтипом ошибки трепетания типа ‘Строка’

#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>>’.