将 API 数据从类传递给 GetX 控制器

Posted

技术标签:

【中文标题】将 API 数据从类传递给 GetX 控制器【英文标题】:Pass API Data to GetX Controller from class 【发布时间】: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"]

【问题讨论】:

【参考方案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!我不知道为什么这没有早点出现在我的脑海中,我猜这是因为编码会话太长了:/ 发生在我们所有人身上 ;)

以上是关于将 API 数据从类传递给 GetX 控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 AngularJs 控制器的令牌传递给 Laravel API

通过 Ajax 将布尔值传递给 asp.net api 控制器

如何使用命令(API)和查询(odata)控制器将位置标头传递给响应

从 Javascript 将 KeyValuePair 或 IDictionary 列表传递给 Web Api 控制器

如何正确地将字符串 id 传递给 Xamarin.Forms 中的 API 控制器

Java:如何将值从类/bean传递给servlet