将 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
}
}
如何将解码后的数据从我的 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
}
}