我有两个API,第一个是给drawList,它有List,第二个是给我在第一个API的响应中得到的特定绘制的过滤器。
API 1:<BASE_URL>/绘制/列表
API 2:<BASE_URL>/draws?过滤器[移民项目]=drawList[0]
API 1的响应:
[
"No Program Specified",
"Canadian Experience Class",
"Provincial Nominee Program",
"Federal Skilled Trades"
]
当我从第一个API得到响应时,我想调用第二个API。
对于drawList API,我使用了FutureProvider
;对于drawFilterAPI,我使用了StateNotifierProvider
,因为当用户从下拉列表中选择另一个字符串时,我需要调用它。
以下是调用drawFilterAPI的提供程序
final updatedItemListProvider = StateNotifierProvider<UpdatedDropDownItemList,
AsyncValue<PreviousDrawResponse>>(
(ref) => UpdatedDropDownItemList(ref.read(apiProvider)));
class UpdatedDropDownItemList
extends StateNotifier<AsyncValue<PreviousDrawResponse>> {
UpdatedDropDownItemList(this.service) : super(const AsyncLoading()) {
callChangeValueAPI(null);
}
final ApiService service;
void callChangeValueAPI(String? newValue) async {
debugPrint('callChangeValueAPI newValue: $newValue');
state = const AsyncLoading();
state = await service.getDrawItemList(newValue);
}
}
这是我的ApiService。目前,我使用了 “未指定程序” 静态。
Future<AsyncValue<PreviousDrawResponse>> getDrawItemList(
String? newValue) async {
String url;
if (newValue == null) {
url =
"$baseUrl/draws?filter[immigration_program]=No program specified";
} else {
url =
"$baseUrl/draws?filter[immigration_program]=$newValue";
}
final response = await get(Uri.parse(url));
PreviousDrawResponse previousDrawResponse =
PreviousDrawResponse.fromJson(jsonDecode(response.body));
if (response.statusCode == 200) {
debugPrint("getDrawItemList response: ${jsonDecode(response.body)}");
return AsyncData(previousDrawResponse);
} else {
// throw Exception('Failed to load data!');
debugPrint("getDrawItemList Error");
return AsyncError('Failed to load data!', StackTrace.current);
}
}
我也使用了.family
修饰符。但是,当我改变下拉值时,它不起作用。
有人帮忙吗?
1条答案
按热度按时间q0qdq0h21#
使用Riverpod 2.0,这变得简单得多。
在小部件中,您可以执行以下操作