代码之家  ›  专栏  ›  技术社区  ›  Al Walid Ashik

如何在Flutter中将List<CustomModel>转换为Map<String,dynamic>

  •  0
  • Al Walid Ashik  · 技术社区  · 5 年前

    我在Flutter中使用了HydradBloc。为了使用HydradBloc,我需要转换我的自定义列表(从JSON字符串解析) List<List<Category>> 到 地图<字符串,动态> 。这是我用来解析json字符串的模型

    import 'dart:convert';
    
    List<List<Category>> rpTrendingCategoriesFromJson(String str) => List<List<Category>>.from(json.decode(str).map((x) => List<Category>.from(x.map((x) => Category.fromJson(x)))));
    
    String rpTrendingCategoriesToJson(List<List<Category>> data) => json.encode(List<dynamic>.from(data.map((x) => List<dynamic>.from(x.map((x) => x.toJson())))));
    
    class Category {
      Category({
        this.title,
        this.imageLink,
      });
    
      String title;
      String imageLink;
    
      factory Category.fromJson(Map<String, dynamic> json) => Category(
        title: json["title"] == null ? null : json["title"],
        imageLink: json["imageLink"] == null ? null : json["imageLink"],
      );
    
      Map<String, dynamic> toJson() => {
        "title": title == null ? null : title,
        "imageLink": imageLink == null ? null : imageLink,
      };
    }
    

    在这里,我需要转换它 列表<列表<类别>> 到 Map<String, dynamic>

    class TrendingCategoriesCubit extends Cubit<TrendingCategoriesState>
        with HydratedMixin {
      Repository repository;
    
      TrendingCategoriesCubit({@required this.repository})
          : super(TrendingCategoriesLoading());
    
      Future<void> fetchTrendingCategories() async {
        emit(TrendingCategoriesLoading());
        List<List<Category>> categories =
            await repository.fetchTrendingCategories();
        if (categories.isEmpty) {
          emit(TrendingCategoriesFetchedEmpty());
        } else if (categories.isNotEmpty) {
          emit(TrendingCategoriesFetched(categories: categories));
        }
      }
    
      @override
      TrendingCategoriesState fromJson(Map<String, dynamic> json) {
        try {
          final categories = rpTrendingCategoriesFromJson(json.toString());
          return TrendingCategoriesFetched(categories: categories);
        } catch (_) {
          return null;
        }
      }
    
      @override
      Map<String, dynamic> toJson(TrendingCategoriesState state) {
        if (state is TrendingCategoriesFetched) {
          return state.categories.toJson(); //coudn't do it
        } else {
          return null;
        }
      }
    }
    

    如果你看看 toJson() 上面的方法,我需要返回 List<List<Categor>> 到 Map<String,dynamic 我该怎么做?

    0 回复  |  直到 5 年前
        1
  •  0
  •   mkobuolys    5 年前

    实现所需结果的一个简单解决方法是为水合BLoC的toJson/fromJson部分创建一个映射:

    @override
    TrendingCategoriesState fromJson(Map<String, dynamic> json) {
      try {
        final categoriesJson = json['categories'];
        final categories = rpTrendingCategoriesFromJson(json.toString());
        return TrendingCategoriesFetched(categories: categories);
      } catch (_) {
        return null;
      }
    }
    
    @override
    Map<String, dynamic> toJson(TrendingCategoriesState state) {
      if (state is TrendingCategoriesFetched) {
        return <String, dynamic>{
          'categories': state.categories.toJson(),
        };
      } else {
        return null;
      }
    }
    

    只需稍微调整代码即可编译,但总体思路是创建一个“临时”Map对象,仅用于持久化和恢复水合状态。