从 JSON 到 Flutter 实体的映射类型错误:'(dynamic) => 'News' 不是类型 '(String, dynamic) => MapEntry<dynamic, dynamic>'

问题描述

我正在尝试读取 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 (将#修改为@)