О моей проблеме особо нечего сказать.
Код:
Future<bool> getThatUrl(cid) async { //cid = 0, for example
Map<String, dynamic> parameters = Map();
String email = '[email protected]';
parameters['email'] = email;
parameters['problematic_id'] = cid;
print(parameters); // prints: {email: [email protected], problematic_id: 0}
var uri = Uri.https('mywebpage.com', '/page.php', parameters);
print(uri); // prints:
}
Проблема в том, что uri
(не генерируется? и) не печатается, пока я не удалю parameters['problematic_id'] = 0
. Если я его удалю, он напечатает https://mywebpage.com/page.php?email=anymail%40anymail.com
, что правильно, но мне это problematic_id=0
тоже нужно.
Я пробовал использовать только один параметр, но если это parameters['problematic_id'] = 0
, то все равно не работает.
На самом деле это запланированное поведение.
Я вижу, что при внутренней реализации каждый value
из queryParameters
должен быть либо Iterable
, либо String?
(String
или null
), а вместо этого вы передаете int
(cid = 0).
Поскольку queryParameters
в любом случае рассматривается как String
, вам не нужно беспокоиться о типе. Итак, чтобы решить эту проблему, лучше просто вызвать toString()
или преобразовать cid
в строку.
Вот код решения:
Uri getUri(String email, int cid) {
Map<String, dynamic> parameters = {
'email': email,
'problematic_id': "$cid"
};
print(parameters);
var uri = Uri.https('mywebpage.com', '/page.php', parameters);
print(uri);
return uri;
}
void main() {
final cid = 0;
final email = '[email protected]';
getUri(email, cid);
}
Здесь строка номер 4 «$cid» преобразует cid в строку, тем самым решая проблему.
Надеюсь это поможет.
Редактировать:
Значение на карте должно быть нулевым, строковым или итерируемым струны.
(Спасибо @jamesdlin за комментарий)
Я получил два правильных решения, но ваш ответ более четко объясняет проблему и дает решение в виде "$cid"
я раньше не замечал
попробуйте явно преобразовать cid в строку перед добавлением параметров.
parameters['problematic_id'] = cid.toString();
Это также правильное решение, но оно дает меньше объяснений, почему это происходит.
Документация
Uri
немного сбивает с толку, но соответствующая документация взята из конструктора Uri: «Значение в карте должно быть либоnull
, строкой, либоIterable
строк». Так что да, так и задумано.