将 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 控制器