#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 я импортировал неправильный класс модели. всем спасибо за помощь.