首页 > 解决方案 > 我如何将自己的变量注入到 Flutter / dart 中的模型类中?

问题描述

背景

使用以下教程:https ://www.raywenderlich.com/5896601-flutter-networking-tutorial-getting-started

我正在从外部 JSON 数据构建一个列表视图。

我有这段代码可以为从我的 JSON 构建的“库”创建模型。

class SiteLibrary {
  final List<MySite> dasite; // 1

  SiteLibrary({required this.dasite});

  factory SiteLibrary.fromRawJson(String str) =>
      SiteLibrary.fromJson(json.decode(str)); // 2

  factory SiteLibrary.fromJson(Map<String, dynamic> json) => SiteLibrary(
      dasite: List<MySite>.from(
          json["appData"].map((x) => MySite.fromJson(x))));

  Map<String, dynamic> toJson() => {
    "appData": List<dynamic>.from(dasite.map((x) => x.toJson())),
  };
}

它被用于 FutureBuilder

FutureBuilder(
              future: _apiResponse.getJSONfromTheSite(),
              builder: (BuildContext context, AsyncSnapshot<Result> snapshot) {
                if (snapshot.data is SuccessState) {
                  SiteLibrary sitedatacollection = (snapshot.data as SuccessState).value;
                  return ListView.builder ...

我想要达到的目标

我想做的是通过将json["appData"]部分作为变量来使这段代码在我的应用程序中可重用。具体"appData"部分。我希望能够在外部告诉这个 SiteLibrary 类使用一个"appData"或多个替代字段,让我们暂时调用"appData2"它们"appData3"
现在,如果我将硬编码更改"appData"为它,"appData2"它将成功检索一组不同的数据。

标签: flutterdart

解决方案


您可以尝试引入一个变量jsonKey来定义要读取的 json 键。请注意,它必须是静态的,因为您尝试在工厂方法中使用它。

class SiteLibrary {
  static String _jsonKey = "appData";
  
  static set jsonKey(String val) {
    _jsonKey = val;
  }
  
  final List<MySite> dasite; // 1

  SiteLibrary({required this.dasite});

  factory SiteLibrary.fromRawJson(String str) =>
      SiteLibrary.fromJson(json.decode(str)); // 2

  factory SiteLibrary.fromJson(Map<String, dynamic> json) => SiteLibrary(
      dasite: List<MySite>.from(
          json[_jsonKey].map((x) => MySite.fromJson(x))));

  Map<String, dynamic> toJson() => {
    _jsonKey: List<dynamic>.from(dasite.map((x) => x.toJson())),
  };
}


推荐阅读