# Dart Linter and Dart Code Analysis ## 緣由 Get Exception below: > Looking up a deactivated widget's ancestor is unsafe. [Solution](https://stackoverflow.com/a/69284760): > To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method. ![](https://hackmd.io/_uploads/SJok4o683.png) Question: 有沒有 Linter 的規則可以幫忙檢查? ## What is Dart Linter 一種靜態分析的工具,幫忙分析並提升程式碼的品質。 - Different levels: `error`, `warning`, `style`, `performance`... - Can ignore rule partially - Automatically fixed by using `dart fix` 在尚未使用 Linter 的專案,突然使用嚴格的規則,可能會很耗時,逐步引入會是比較好的做法。甚至可能會想去深入瞭解規則,或是自訂規則。 ## How Do I Use the Dart Linter? 寫在 `analysis_options.yaml`: ```yaml= include: all_lint_rules.yaml analyzer: exclude: - "**/*.g.dart" ... language: strict-casts: true ... errors: included_file_warning: ignore ... linter: rules: - avoid_print ... ``` * [All Lint Rules](https://dart-lang.github.io/linter/lints/options/options.html) * [all_lint_rules_community](https://pub.dev/packages/all_lint_rules_community) package * [Enabling stricter type checks](https://dart.dev/guides/language/analysis-options#enabling-additional-type-checks) ## flutter lint > This [package](https://pub.dev/packages/flutter_lints) is built on top of Dart's [recommended.yaml](https://github.com/flutter/packages/blob/3c3c980df1add6b34c49e8c5d712484287fa8976/packages/flutter_lints/lib/flutter.yaml#LL3C40-L3C40) set of lints from package:lints. ### Rules in multiple package ![img](https://dart.dev/assets/img/guides/analysis-options-directory-structure.png) ### Multiple include in analysis_options.yaml? `recommended.yaml`: > include: package:lints/core.yaml `flutter.yaml`: > package:lints/recommended.yaml `flutter.yaml` = `recommended.yaml` + `core.yaml` ### 常見的 Linter 與比較 * [Linters Comparison](https://rydmike.com/blog_flutter_linting#what-are-the-rule-differences-between-all-these-packages) ## Dart Code Metrics (DCM) Pricing For [Individuals/Teams/Enterprise](https://dcm.dev/pricing/). ### Rules Use as plugins. (flutter lint + DCM is easy) #### warning - [prefer-iterable-of](https://dcm.dev/docs/individuals/rules/common/prefer-iterable-of/) > .from() allows potentially unsafe downcasting and enforces convertibility at runtime. - [always-remove-listener](https://dcm.dev/docs/individuals/rules/flutter/always-remove-listener/) > This results in memory leaks if the valueListenable lifecycle is significantly longer than the widget. - [list-all-equatable-fields](https://dcm.dev/docs/rules/equatable/list-all-equatable-fields/) > Warns when a field is not added to props getter of a class that extends Equatable or EquatableMixin. - [use-setstate-synchronously](https://dcm.dev/docs/individuals/rules/flutter/use-setstate-synchronously/) > the possibility that the widget has been unmounted needs to be checked before calling setState. - [avoid-wrapping-in-padding](https://dcm.dev/docs/individuals/rules/flutter/avoid-wrapping-in-padding/) > Warns when a widget is wrapped in a Padding widget but has a padding settings by itself. #### performance - [avoid-border-all](https://dcm.dev/docs/individuals/rules/flutter/avoid-border-all/) - [prefer-const-border-radius](https://dcm.dev/docs/individuals/rules/flutter/prefer-const-border-radius/) - [avoid-shrink-wrap-in-lists](https://dcm.dev/docs/individuals/rules/flutter/avoid-shrink-wrap-in-lists/) - [prefer-using-list-view](https://dcm.dev/docs/individuals/rules/flutter/prefer-using-list-view/) ### Command Line Interface (CLI) - Check Unnecessary Nullable Parameters ```script= flutter pub run dart_code_metrics:metrics check-unnecessary-nullable lib ``` - Check Unused Code ```script= flutter pub run dart_code_metrics:metrics check-unused-code lib ``` - Check Unused Files ```script= flutter pub run dart_code_metrics:metrics check-unused-files lib ``` - [Work with Gitlab](https://dcm.dev/docs/individuals/cli/analyze/#gitlab) ```script= flutter pub run dart_code_metrics:metrics analyze lib --reporter=html ``` ### Metrics & Anti-patterns ```yaml= dart_code_metrics: metrics: cyclomatic-complexity: 20 anti-patterns: - long-method ``` ### 2023/06/06 Sunset free version [Announcing DCM free version sunset](https://dcm.dev/blog/2023/06/06/announcing-dcm-free-version-sunset/) 1. Plugins API performance issue. 2. Needs a bigger and stable group of contributors. * [Github Repository](https://github.com/dart-code-checker/dart-code-metrics) ## Custom Lint > [Custom_lint](https://pub.dev/packages/custom_lint) is similar to [analyzer_plugin](https://pub.dev/packages/analyzer_plugin), but goes deeper by trying to provide a better developer experience. ## Dart Style The [dart_style](https://pub.dev/packages/dart_style) package defines an automatic, opinionated formatter for Dart code. It replaces the whitespace in your program with what it deems to be the best formatting for it. Resulting code should follow the Dart style guide but, moreso, should look nice to most human readers, most of the time. ## Reference * [點擊市場 Tab 後,再登出富果會員,console 會丟 Exception](https://git.fugle.tw/fugle/workspace-devs/fugle-flutter/-/issues/740) * [Customizing static analysis](https://dart.dev/guides/language/analysis-options) * [Flutter Linting and Linter Comparison](https://rydmike.com/blog_flutter_linting#what-are-the-rule-differences-between-all-these-packages) ###### tags: `fugle study group`