Skip to content

Commit 958947b

Browse files
authored
Merge pull request #1252 from appwrite/fix-dart-flutter-optional-params
fix: strip non-nullable optional params in Dart/Flutter SDKs
2 parents 1a7a3b8 + 3c12f46 commit 958947b

File tree

4 files changed

+46
-26
lines changed

4 files changed

+46
-26
lines changed

templates/dart/base/utils.twig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
{% macro map_parameter(parameters) %}
22
{% for parameter in parameters %}
3+
{% if not parameter.nullable and not parameter.required %}
4+
if ({{ parameter.name | caseCamel | overrideIdentifier }} != null) '{{ parameter.name }}': {{ parameter.name | caseCamel | overrideIdentifier }}{% if parameter.enumValues | length > 0 %}!.value{% endif %},
5+
{% else %}
36
'{{ parameter.name }}': {{ parameter.name | caseCamel | overrideIdentifier }}{% if parameter.enumValues | length > 0 %}{% if not parameter.required %}?{% endif %}.value{% endif %},
7+
{% endif %}
48
{% endfor %}
59
{% endmacro %}
610

templates/dart/lib/src/client_mixin.dart.twig

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,25 @@ mixin ClientMixin {
1212
required Map<String, String> headers,
1313
required Map<String, dynamic> params,
1414
}) {
15-
if (params.isNotEmpty) {
16-
params.removeWhere((key, value) => value == null);
17-
}
1815

1916
http.BaseRequest request = http.Request(method.name(), uri);
2017
if (headers['content-type'] == 'multipart/form-data') {
2118
request = http.MultipartRequest(method.name(), uri);
2219
if (params.isNotEmpty) {
2320
params.forEach((key, value) {
21+
if (value == null) {
22+
return;
23+
}
2424
if (value is http.MultipartFile) {
2525
(request as http.MultipartRequest).files.add(value);
2626
} else {
2727
if (value is List) {
2828
value.asMap().forEach((i, v) {
29-
(request as http.MultipartRequest)
30-
.fields
31-
.addAll({"$key[$i]": v.toString()});
29+
if (v != null) {
30+
(request as http.MultipartRequest)
31+
.fields
32+
.addAll({"$key[$i]": v.toString()});
33+
}
3234
});
3335
} else {
3436
(request as http.MultipartRequest)
@@ -40,15 +42,19 @@ mixin ClientMixin {
4042
}
4143
} else if (method == HttpMethod.get) {
4244
if (params.isNotEmpty) {
43-
params = params.map((key, value){
44-
if (value is int || value is double) {
45-
return MapEntry(key, value.toString());
46-
}
47-
if (value is List) {
48-
return MapEntry("$key[]", value);
45+
Map<String, dynamic> filteredParams = {};
46+
params.forEach((key, value) {
47+
if (value != null) {
48+
if (value is int || value is double) {
49+
filteredParams[key] = value.toString();
50+
} else if (value is List) {
51+
filteredParams["$key[]"] = value;
52+
} else {
53+
filteredParams[key] = value;
54+
}
4955
}
50-
return MapEntry(key, value);
5156
});
57+
params = filteredParams;
5258
}
5359
uri = Uri(
5460
fragment: uri.fragment,

templates/flutter/base/utils.twig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
{%- macro map_parameter(parameters) -%}
22
{%- for parameter in parameters ~%}
3+
{% if not parameter.nullable and not parameter.required %}
4+
if ({{ parameter.name | caseCamel | overrideIdentifier }} != null) '{{ parameter.name }}': {{ parameter.name | caseCamel | overrideIdentifier }}{% if parameter.enumValues | length > 0 %}!.value{% endif %},
5+
{% else %}
36
'{{ parameter.name }}': {{ parameter.name | caseCamel | overrideIdentifier }}{% if parameter.enumValues | length > 0 %}{% if not parameter.required %}?{% endif %}.value{% endif %},
7+
{% endif %}
48
{%- endfor ~%}
59
{%- endmacro ~%}
610

templates/flutter/lib/src/client_mixin.dart.twig

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,25 @@ mixin ClientMixin {
1212
required Map<String, String> headers,
1313
required Map<String, dynamic> params,
1414
}) {
15-
if (params.isNotEmpty) {
16-
params.removeWhere((key, value) => value == null);
17-
}
1815

1916
http.BaseRequest request = http.Request(method.name(), uri);
2017
if (headers['content-type'] == 'multipart/form-data') {
2118
request = http.MultipartRequest(method.name(), uri);
2219
if (params.isNotEmpty) {
2320
params.forEach((key, value) {
21+
if (value == null) {
22+
return;
23+
}
2424
if (value is http.MultipartFile) {
2525
(request as http.MultipartRequest).files.add(value);
2626
} else {
2727
if (value is List) {
2828
value.asMap().forEach((i, v) {
29-
(request as http.MultipartRequest).fields.addAll({
30-
"$key[$i]": v.toString(),
31-
});
29+
if (v != null) {
30+
(request as http.MultipartRequest).fields.addAll({
31+
"$key[$i]": v.toString(),
32+
});
33+
}
3234
});
3335
} else {
3436
(request as http.MultipartRequest).fields.addAll({
@@ -40,15 +42,19 @@ mixin ClientMixin {
4042
}
4143
} else if (method == HttpMethod.get) {
4244
if (params.isNotEmpty) {
43-
params = params.map((key, value){
44-
if (value is int || value is double) {
45-
return MapEntry(key, value.toString());
46-
}
47-
if (value is List) {
48-
return MapEntry("$key[]", value);
45+
Map<String, dynamic> filteredParams = {};
46+
params.forEach((key, value) {
47+
if (value != null) {
48+
if (value is int || value is double) {
49+
filteredParams[key] = value.toString();
50+
} else if (value is List) {
51+
filteredParams["$key[]"] = value;
52+
} else {
53+
filteredParams[key] = value;
54+
}
4955
}
50-
return MapEntry(key, value);
5156
});
57+
params = filteredParams;
5258
}
5359
uri = Uri(
5460
fragment: uri.fragment,

0 commit comments

Comments
 (0)