-
Notifications
You must be signed in to change notification settings - Fork 125
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix nullable QueryMap fails to compile #344
Conversation
Thank you sooooooo much! |
Please reformat code :) |
Done. My bad :) |
I just found out how to do a more precise null check on the parameters. In essence, I built an // Build an iterable of all the parameters that are nullable
final Iterable<String> optionalNullableParameters = [
...m.parameters.where((p) => p.isOptionalPositional),
...m.parameters.where((p) => p.isNamed),
].where((el) => el.type.isNullable).map((el) => el.name); which in the case of building a if (optionalNullableParameters.contains(queryMap.keys.first)) {
// do nullable stuff
} else {
// do non nullable stuff
} This way I can remove This means that @Get(path: 'query_map')
Future<Response> getQueryMapTest2(
@QueryMap() Map<String, dynamic> query, {
@Query('test') bool? test,
}); will correctly produce @override
Future<Response<dynamic>> getQueryMapTest2(Map<String, dynamic> query,
{bool? test}) {
final $url = '/test/query_map';
final $params = <String, dynamic>{'test': test};
$params.addAll(query);
final $request = Request('GET', $url, client.baseUrl, parameters: $params);
return client.send<dynamic, dynamic>($request);
} and @Get(path: 'query_map')
Future<Response> getQueryMapTest4({
@Query('name') String name = '',
@Query('number') int? number,
@QueryMap() Map<String, dynamic>? filters, // <-- nullable / optional filters
}); will correctly produce @override
Future<Response<dynamic>> getQueryMapTest4(
{String name = '', int? number, Map<String, dynamic>? filters}) {
final $url = '/test/query_map';
final $params = <String, dynamic>{'name': name, 'number': number};
$params.addAll(filters ?? {});
final $request = Request('GET', $url, client.baseUrl, parameters: $params);
return client.send<dynamic, dynamic>($request);
} |
* Fix Header Option Casting (#260) Co-authored-by: Ivan Terekhin <[email protected]> * Fix for #259 (#263) * 4.0.1 fixes (#264) * analyzer dependency upgraded (#296) * fix(generator): fix PartValueFile value not nullable if arg is (#288) (#293) * Chopper generator release 4.0.2 (#297) * fix: fix this.body cast of null value when response body is null (#291) (#292) * Interpolation fixes (#275) * encodeQueryComponent now encodeComponent (#278) * Prevent double call on token refreshment (#276) * Fixes for #309 #308 (#310) * Remove new keyword from interceptors.md (#312) * Analyzer upgrade (#320) Co-authored-by: István Juhos <[email protected]> * Add unnecessary_brace_in_string_interps to lint ignores (#317) * Extend pragma to quiet the linter (#318) Co-authored-by: Ivan Terekhin <[email protected]> * Fix converter getting called twice if using an authenticator with a JsonConverter on the request (#324) * migrate example to nullsafety (#331) * Resolve problem in main_json_serializable example (#328) * Add @FiledMap @PartMap @PartFileMap (#335) Co-authored-by: Meysam Karimi <[email protected]> * Upgrade of analyzer (#340) * Fix nullable QueryMap fails to compile (#344) * Change return type of decodeJson to FutureOr in order to be able to support compute() (#345) * Migrate from pedantic to lints ^2.0.0 with lints/recommended.yaml (#349) * Version bumped for release (#352) * Revert analyzer to ^4.1.0 and silence linters for Element.enclosingElement (#354) * [chopper_generator] Update analyzer to ^4.4.0 and code_builde to ^4.3.0 and migrate deprecated code (#358) * Add Makefiles to streamline development (#357) * Add Bug Report Github issue template (#359) * [chopper_generator] Add types to the generated variables (#360) * Provide an example using an Isolate Worker Pool with Squadron (#361) * mapToQuery changes (#364) * Version bumped / changelog update (#367) * Request extends http.BaseRequest (#370) * Exclude null query vars by default and add new @method annotation includeNullQueryVars (#372) * 5.1.0 (dev) (#373) Co-authored-by: Ivan Terekhin <[email protected]> Co-authored-by: Youssef Raafat <[email protected]> Co-authored-by: luis901101 <[email protected]> Co-authored-by: melvspace <[email protected]> Co-authored-by: Michal Šrůtek <[email protected]> Co-authored-by: István Juhos <[email protected]> Co-authored-by: Andre <[email protected]> Co-authored-by: John Wimer <[email protected]> Co-authored-by: Max Röhrl <[email protected]> Co-authored-by: ipcjs <[email protected]> Co-authored-by: ibadin <[email protected]> Co-authored-by: Meysam Karimi <[email protected]> Co-authored-by: Meysam Karimi <[email protected]> Co-authored-by: Klemen Tusar <[email protected]> Co-authored-by: Klemen Tusar <[email protected]> Co-authored-by: Ivan Terekhin <[email protected]>
This addresses #343
I've used Expression.ifNullThen to additionally check for a nullable
QueryMap
.This should be able to take
and generate
without any subsequent compilation errors.
Before this hotfix one had to use a default
const {}
like this in order to omit theQueryMap
and avoid a compilation errorwhich would generate
However, this fix will also add a null check??
when the value is not nullable and that's why I've added the extra ignore flagdead_null_aware_expression
in order to silence the linter in a case like thiswhich generatesAs such, this should be regarded more or less as a hotfix as some more robust null checking should be performed on theQueryMap
itself. At this point, I lack the expertise to do this withsource_gen
and would appreciate any further guidance 😊EDIT: This issue has now been rectified. See #344 (comment)
Oh, and of course, I've added a few test cases. ☑️