问题描述
我正在尝试读取 JSON 文件,然后将值分配到我的 Flutter 实体中,使用 riverpod、statenotifier 并冻结以进行简单的 API 测试。
目前,当我解析 JSON 文件并映射到实体时,我收到这样的错误
I/Flutter ( 7083): type '(dynamic) => 'News' is not a subtype of type '(String,dynamic) => MapEntry<dynamic,dynamic>' of 'transform'
这是我的实体,它具有 fromJson
方法并已冻结。
@freezed
abstract class News with _$News {
const factory News({
bool? ok,@Default(null) dynamic error,Data? data,}) = _News;
factory News.fromJson(Map<String,dynamic> json) =>
_$NewsFromJson(json);
}
这是我尝试解析但收到错误的存储库的一部分。
my_data
被正确解析和存储,但映射到我的实体 News
有一些冲突
如上。
final NewsRepositoryProvider = Provider<NewsRepository>((ref) {
return NewsRepository();
});
class NewsRepository {
Future<List<News>> getNews() async {
// parse my local json file
final my_data =
json.decode(await rootBundle.loadString('temp.json'));
try {
return my_data
.map((dynamic item) =>
News.fromJson(item as Map<String,dynamic>))
.toList();
} on Exception catch (error) {
throw Exception('JSON Failed: $error');
}
}
}
当我尝试像下面这样写时,它返回 NoSuchMethodError: Class _InternalLinkedHashMap<String,dynamic> has no instance method cast with matching arguments.
并且显然它没有转换方法...... `
final my_data = json
.decode(await rootBundle.loadString('temp.json'))
.cast<Map<String,dynamic>>();
final LatestFeedRepository _newsRepository;
final LatestFeedStateNotifier _newsManager;
Future<void> fetchLatestNews() async {
try {
final List<News> newList = await _newsRepository.getNews();
_newsManager.setNews(newList);
state = state.copyWith(isLoading: false);
} catch (e) {
print(e);
}
这是我的 StateNotifierProvider,我想用 setNews
对象调用 List<News>
,该对象应该来自解析操作,但目前我确实有错误,我无法传递参数。
@freezed
abstract class Newsstate with _$Newsstate {
const factory Newsstate({
List<News>? news,}) = _Newsstate;
}
final newsProvider =
StateNotifierProvider<NewsstateNotifier,dynamic>(
(_) => NewsstateNotifier());
class NewsstateNotifier extends StateNotifier<Newsstate>
with LocatorMixin {
NewsstateNotifier() : super(const Newsstate());
void setNews(List<News> news) {
state = state.copyWith(news: news);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)