diff --git a/rules/S7117/dart/metadata.json b/rules/S7117/dart/metadata.json new file mode 100644 index 00000000000..389e3dada65 --- /dev/null +++ b/rules/S7117/dart/metadata.json @@ -0,0 +1,23 @@ +{ + "title": "\"SizedBox\" should be used to add a whitespace to a layout", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "2min" + }, + "tags": [ + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-7117", + "sqKey": "S7117", + "scope": "All", + "defaultQualityProfiles": ["Sonar way"], + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM" + }, + "attribute": "EFFICIENT" + } +} diff --git a/rules/S7117/dart/rule.adoc b/rules/S7117/dart/rule.adoc new file mode 100644 index 00000000000..19ed9058c7f --- /dev/null +++ b/rules/S7117/dart/rule.adoc @@ -0,0 +1,68 @@ +Use `SizedBox` instead of `Container`, when need to add a whitespace to layout. + +== Why is this an issue? + +In Flutter https://api.flutter.dev/flutter/widgets/SizedBox-class.html[`SizedBox`] represents a widget of a specified size. It is used to control the dimensions of the child widget. https://api.flutter.dev/flutter/widgets/Container-class.html[`Container`] is another Flutter widget, that doesn't only provide width and height, but also applies additional constraints, decorations, transformations, etc. Thus `Container` is a more advanced and at the same time a much heavier widget. It is recommended to not use it, if the only need is to add a whitespace. `SizedBox` is a better option for such simple cases. You can even benefit from a const constructor of a `SizedBox`, if applicable in your case. + +The rule reports issue on the `Container` instance creation, if: + +* Both `width` and `heigh` are specified and there are no other parameters except optional `key`; +* `child` is specified, at least one of `width` or `heigh` is specified and there are no other parameters except optional `key`; + +=== What is the potential impact? + +A misuse of a `Container` widget may affect you performance and make the layout overly complicated. + +== How to fix it +Replace `Container` with `SizedBox` + +=== Code examples + +==== Noncompliant code example + +[source,dart,diff-id=1,diff-type=noncompliant] +---- +List widgets(){ + return [ + Container(width: 4, height: 5), + Container(key: Key("MyWidget"), child: MyWidget(), height: 5) + ]; +} +---- + +==== Compliant solution + +[source,dart,diff-id=1,diff-type=compliant] +---- +List widgets(){ + return [ + SizedBox(width: 4, height: 5), + SizedBox(key: Key("MyWidget"), child: MyWidget(), height: 5) + ]; +} +---- + +== Resources + +=== Documentation + +* Dart Docs - https://dart.dev/tools/linter-rules/sized_box_for_whitespace[Dart Linter rule - sized_box_for_whitespace] +* Flutter Docs - https://api.flutter.dev/flutter/widgets/Container-class.html[widgets - Container class] +* Flutter Docs - https://api.flutter.dev/flutter/widgets/SizedBox-class.html[widgets - SizedBox class] + +ifdef::env-github,rspecator-view[] + +''' +== Implementation Specification +(visible only on this page) + +=== Message + +Use a 'SizedBox' to add whitespace to a layout. + +=== Highlighting + +`Constainer` constructor invocation without parameters + + +endif::env-github,rspecator-view[] diff --git a/rules/S7117/metadata.json b/rules/S7117/metadata.json new file mode 100644 index 00000000000..2c63c085104 --- /dev/null +++ b/rules/S7117/metadata.json @@ -0,0 +1,2 @@ +{ +}