тип «Список» не является подтипом типа «Список» в приведенном типе

#flutter #dart

Вопрос:

Я довольно новичок в мире флаттера и в настоящее время застрял в кастинге типов. Я думаю, что делаю это правильно, но flutter думает, что это не так, вот почему он выдает ошибку при компиляции кода. Вот что я делаю.

 FutureBuilder(  future: newsHistoryService.newsHistoryByCategoryType(  newsType: dropdownValue),  builder: (context, snapshot) {  if (snapshot.hasData) {  Listlt;NewsHistoryModelgt; data = snapshot.data as Listlt;NewsHistoryModelgt;;  return data.isNotEmpty  ? ListView.builder(  )  : emptyWidget();  }  return snapWidgetHelper(snapshot,  defaultErrorMessage: errorSomethingWentWrong);  },  ).paddingAll(16)  

newsHistoryService.newsHistoryByCategoryType функционируйте следующим образом:

 Futurelt;Listlt;NewsHistoryModelgt;gt; newsHistoryByCategoryType( {String? newsType}) async {  return await ref!  .where(NewsHistoryKeys.userId, isEqualTo: appStore.userId)  .where(NewsHistoryKeys.newType, isEqualTo: newsType)  .orderBy(CommonKeys.createdAt, descending: true)  .get()  .then((value) =gt; value.docs  .map((e) =gt;  NewsHistoryModel.fromJson(e.data() as Maplt;String, dynamicgt;))  .toList());  }  

Флаттер выдает следующую ошибку:

 Another exception was thrown: type 'Listlt;NewsHistoryModelgt;' is not a subtype of type 'Listlt;NewsHistoryModelgt;' in type cast.  

Строка, ответственная за эту ошибку, является:

 Listlt;NewsHistoryModelgt; data = snapshot.data as Listlt;NewsHistoryModelgt;;  

Как я могу правильно назначить объект Listlt;NewsHistoryModelgt; firestore . Любая помощь будет очень признательна.

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

1. По назначению newsHistoryByCategoryType , вы пробовали .toList().castlt;NewsHistoryModelgt;() ?

Ответ №1:

Проблема здесь в том, что Firebase хранит списки как динамический список. Что вы можете попытаться сделать, так это;

 FutureBuilder(  future: newsHistoryService.newsHistoryByCategoryType(  newsType: dropdownValue),  builder: (context, snapshot) {  if (snapshot.hasData) {  Listlt;NewsHistoryModelgt; data = snapshot.data.castlt;Listlt;NewsHistoryModelgt;gt;;  return data.isNotEmpty  ? ListView.builder(  )  : emptyWidget();  }  return snapWidgetHelper(snapshot,  defaultErrorMessage: errorSomethingWentWrong);  },  ).paddingAll(16)  

Или, если это не сработает, вы можете попробовать изменить заводской метод, который у вас есть для NewHistoryModel, и добавить .cast в необходимые поля.

Ответ №2:

Вы можете попробовать

 Listlt;NewsHistoryModelgt; data = Listlt;NewsHistoryModelgt;.from(snapshot.data);  

или также изменить

 value.docs  .map((e) =gt;  NewsHistoryModel.fromJson(e.data() as Maplt;String, dynamicgt;))  .toList());  

Для:

 Listlt;NewsHistoryModelgt;.from(value.docs  .map((e) =gt;  NewsHistoryModel.fromJson(Maplt;String, dynamicgt;.from(e.data())))  .toList()));  

Ответ №3:

Прости, что это была глупая ошибка. в файле newsHistoryService я импортировал неправильный класс модели. всем спасибо за помощь.