Я пытаюсь отправить запрос запроса во флете в API-интерфейс graphQL, управляемый AWS appsync. Вот функция, которая выполняет запрос.
Future<void> getUsersByLocation(
String subId, double lat, double long, double distance) async {
const getUsersByLocation = 'getUsersByLocation';
final String getUsersDoc = '''
query getUsersByLocation(\$distance: Float!, \$latitude: Float!, \$longitude: Float!, \$reqUserSubId: String!) {
$getUsersByLocation(distance: \$distance, latitude: \$latitude, longitude: \$longitude, reqUserSubId: \$reqUserSubId) {
name
}
}
''';
final Map<String, dynamic> inputVars = <String, dynamic>{
'reqUserSubId': subId,
'latitude': lat,
'longitude': long,
'distance': distance,
};
final request = GraphQLRequest<List<User>>(
document: getUsersDoc,
modelType: User.classType,
variables: inputVars,
decodePath: getUsersByLocation,
);
try {
final response = await Amplify.API.query(request: request).response;
print('Response: $response.data');
} catch (error) {
print('error :${error.toString()}');
}
}```
Ошибка, которую я получаю,
'List<dynamic>' is not a subtype of type 'Map<String, dynamic>?'
API-интерфейс graphQL возвращает список пользователей, но функция пути декодирования ожидает Map<String, dynamic>?. Мне нужно написать собственную функцию пути декодирования, которая принимает список, но я не уверен, как это сделать.
Я создал пользовательскую функцию, которая принимает List в качестве входных данных и помещает имя функции в качестве decodePath, но это не сработало. Я также просмотрел документацию, но в ней не упоминается, как создать собственный путь декодирования.
Я понял, как решить эту проблему. Удалите modelType и decodePath, и он даст вам ответ в виде Sting. Затем вы можете вручную декодировать строку с помощью декодера json. Вот фиксированный код:
String subId, double lat, double long, double distance) async {
const getUsersByLocation = 'getUsersByLocation';
final String getUsersDoc = '''
query getUsersByLocation(\$distance: Float!, \$latitude: Float!, \$longitude: Float!, \$reqUserSubId: String!) {
$getUsersByLocation(distance: \$distance, latitude: \$latitude, longitude: \$longitude, reqUserSubId: \$reqUserSubId) {
name
}
}
''';
final Map<String, dynamic> inputVars = <String, dynamic>{
'reqUserSubId': subId,
'latitude': lat,
'longitude': long,
'distance': distance,
};
// Remove the modelType and decodePath parameters.
final request = GraphQLRequest(
document: getUsersDoc,
variables: inputVars,
);
try {
final response = await Amplify.API.query(request: request).response;
if (response.data != null) {
// Decode the data here
final jsonData =
(json.decode(response.data) as Map).cast<String, Object?>();
print(jsonData);
}
} catch (error) {
print('error :${error.toString()}');
}
}```