【问题标题】:Pass API Data to GetX Controller from class将 API 数据从类传递给 GetX 控制器
【发布时间】:2021-08-13 21:30:16
【问题描述】:

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

这是我的“德国”类和我的 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"]

【问题讨论】:

    标签: api flutter dart get flutter-getx


    【解决方案1】:

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

    也不确定您的 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
      }
    }
    

    【讨论】:

    • 非常感谢!
    • 没问题,乐于助人。
    【解决方案2】:

    为什么不直接使用返回的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.
    

    【讨论】:

    • Tysm @DarShan!我不知道为什么这没有早点出现在我的脑海中,我猜这是因为编码会话太长了:/
    • 发生在我们所有人身上 ;)
    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 2017-09-20
    • 2021-04-27
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多