将 API 数据从 class 传递到 GetX 控制器

Pass API Data to GetX Controller from class

如何将解码后的数据从我的 Api 传递到我的 GetX 控制器?

这是我的 Class“德国”和我的 fetchGermany() 函数。

Future<Germany> fetchGermany() async {
  final response =
      await get(Uri.parse('https://api.corona-zahlen.org/germany'));

  if (response.statusCode == 200) {
    return Germany.fromJson(jsonDecode(response.body));
  } else {
    throw Exception('Failed to get data');
  }
}

class Germany {
  int cases;
  int deaths;
  int recovered;
  double weekIncidence;
  double casesPer100k;
  int casesPerWeek;

  Germany(
      {required this.cases,
      required this.deaths,
      required this.recovered,
      required this.weekIncidence,
      required this.casesPer100k,
      required this.casesPerWeek});

  factory Germany.fromJson(Map<String, dynamic> json) {
    return Germany(
        cases: json["cases"],
        deaths: json["deaths"],
        recovered: json["recovered"],
        weekIncidence: json["weekIncidence"],
        casesPer100k: json["casesPer100k"],
        casesPerWeek: json["casesPerWeek"]);
  }
}

这是我的 GetX 控制器,目前是空的:

class DetailController extends GetxController {

}

所以基本上我只想能够访问这些数据:

    cases: json["cases"],
    deaths: json["deaths"],
    recovered: json["recovered"],
    weekIncidence: json["weekIncidence"],
    casesPer100k: json["casesPer100k"],
    casesPerWeek: json["casesPerWeek"]

为什么不直接使用返回的 Germany 对象?
我认为没有必要在这里使用 GetxController

可以简单地用作:

Germany _germany;

@override
void initState() {
  super.initState();
  fetchGermanyData();
}

fetchGermanyData() async {
  final fetchedData = await fetchGermany();
  setState(() => _germany = fetchedData);
}

/// use ? : operator to show relevant UI in the build method.

虽然我同意@DarShan 的观点,您在这里不一定需要 GetXController,但我仍然只是为了简单地使用无状态小部件而不是有状态小部件。如果没有其他原因,只是为了减少混乱 UI 代码和分离业务逻辑。

也不确定您的 Api 调用函数是否是全局的,或者您的示例中是否就是这样,但如果它是全局的,我会创建一个助手 class.

class ApiHelper {
  Future<Germany> fetchGermany() async {
    final response =
        await get(Uri.parse('https://api.corona-zahlen.org/germany'));

    if (response.statusCode == 200) {
      return Germany.fromJson(jsonDecode(response.body));
    } else {
      throw Exception('Failed to get data');
    }
  }
}

那么你的 GetX class 可以是这样的。

class DetailController extends GetxController {
Germany germany;

  @override
  void onInit() async {
    super.onInit();
    final apiHelper = ApiHelper();
    germany = await apiHelper.fetchGermany();
  }
}

这是一个使用 GetView 小部件的示例,它只是一个无状态小部件,具有您提供的类型的内置控制器,而无需找到它。

class GermanyExample extends GetView<DetailController> {
  @override
  Widget build(BuildContext context) {
    // access the initialized Germany object with controller.germany
    return // the rest of your UI
  }
}