Передача данных API в GetX Controller из класса

Как я могу передать декодированные данные с моего API на контроллер GetX?

Вот мой Class Germany и моя функция 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"]

person Mesota22    schedule 25.05.2021    source источник


Ответы (2)


Хотя я согласен с @DarShan, что здесь вам не обязательно нужен GetXController, я бы все же просто ради использования виджета без сохранения состояния поверх виджета с отслеживанием состояния. Хотя бы по той причине, что менее загроможденный код пользовательского интерфейса и разделяющая бизнес-логика.

Также не уверен, является ли ваша функция вызова Api глобальной или именно такой, как в вашем примере, но если она глобальная, я бы создал вспомогательный класс.

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 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
  }
}
person Loren.A    schedule 25.05.2021
comment
Большое спасибо! - person Mesota22; 26.05.2021
comment
Нет проблем, рад помочь. - person Loren.A; 26.05.2021

Почему бы напрямую не использовать возвращенный объект 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.
person DarShan    schedule 25.05.2021
comment
Тысм @DarShan! Я не знаю, почему это не пришло мне в голову раньше, я полагаю, это происходит из-за слишком долгих сеансов кодирования: / - person Mesota22; 25.05.2021
comment
Бывает со всеми нами;) - person DarShan; 25.05.2021