Decoding Flutter Lint, Nemesis of Bad Code

Hamber
6 min readJul 27, 2023

--

Lint Basics and Importance

Understanding Lint: Definition and Purpose

Lint is a static code analysis tool used in software development to check for programming errors, bugs, stylistic errors and suspicious constructs. It assists developers in maintaining a consistent coding style, filtering out potential error-prone code sections, and improving overall code quality.

“Suspicious constructs” here refers to parts of the code that may have issues or could lead to unexpected behavior. These could include insecure function calls, constructs that could lead to memory leaks, uninitialized variables, and so forth. In simple terms, they are those pieces of code that appear to have potential to cause problems.

Significance of Linting in Programming

Linting in programming aids in the identification of certain errors before the execution of the program. As such, it can help save development time, promote better code hygiene, and ensure the maintainability and scalability of the software by enforcing coding standards.

Linting Tools and Their Roles

Many programming languages have their own specific linting tools. These tools parse codes for detailed error checking and follow certain rules/standards to notify developers about possible mistakes or bad practices found in their code. For example, ESLint for JavaScript or Pylint for Python or flutter_lints for Flutter.

Lint’s Impact on Code Quality

By using Lint, developers can easily detect and correct common coding mistakes and stylistic issues. This helps maintain code quality consistently throughout the project, which reduces the chances of errors, enhances readability, and promotes efficient team collaboration.

Enhancing Efficiency with Lint

Lint tools can automate the tedious process of code review and error detection, leading to improved efficiency. They can also encourage the adoption of best practices and adherence to predefined coding standards, thereby minimizing the chance of bugs slipping into production.

Potential Risks in Code without Lint Applications

Without the application of Lint, code might possess hidden bugs, unoptimized parts, or violations of coding standards. These issues are often difficult to spot manually and can seriously harm the performance and robustness of the software application.

General Usage of Lint in Software Development Projects

Lint is commonly integrated into the development process in multiple ways, such as part of the code review process, continuous integration pipelines, or even running as a stand-alone tool to help developers spot issues before committing changes. Its widespread usage demonstrates its importance in cultivating high-quality, error-free software development.

How to Configure and Use Flutter Lint

Introduction to Flutter Lint

Flutter Lint is a set of rule options that analyzes Dart code in Flutter applications. Essentially, it’s a predefined set of lint rules provided by the Flutter team, intended to ensure best practices and code consistency in Flutter projects.

Setting up Flutter Lint

In order to use Flutter Lint, you need to add it to your Flutter project. Open your pubspec.yaml file and add the following line to the dev_dependencies section:

dev_dependencies:
flutter_lints: ^2.0.2

Then run flutter pub get in the terminal to download and set up the package.

Configuring Flutter Lint Rules

Flutter Lint uses the analysis_options.yaml file in the root of the project to determine which rules to enforce. You can modify this file to either remove unwanted rules or add new ones:

include: package:flutter_lints/flutter.yaml

linter:
rules:
prefer_const_constructors: true

The example above includes the default set of rules (provided by flutter_lints) and adds a specific rule (prefer_const_constructors).

Running Flutter Lint

After configuring Flutter Lint, you can check your code by running the dart analyze command in the terminal. This will output any violations it finds in accordance to the rules set in the analysis_options.yaml file.

Interpreting Flutter Lint Results

When you run Flutter Lint, the results will show you where your code has violated any rules. It shows the file path and the description of the violation:

  /your_project/lib/main.dart:10: Prefer const with constant constructors.

You can use this information to make modifications to your code to ensure it aligns with the lint rules you’ve put in place.

dart fix --dry-run
dart fix --apply

Diving Deeper into analysis_options.yaml Configuration

The analysis_options.yaml file allows you to customize the behavior of the Dart analyzer and Flutter lint rules. Let's dissect a sample configuration:

include: package:lints/recommended.yaml

analyzer:
exclude: [build/**]
language:
strict-casts: true
strict-raw-types: true

linter:
rules:
- cancel_subscriptions
  • include: package:lints/recommended.yaml: This line includes a set of recommended lint rules provided by the Dart team.
  • analyzer:: This section configures the behavior of the Dart analyzer for your project.
  • exclude: [build/**]: This directive excludes certain files or directories from analysis. In this case, any files in the build/ directory are ignored.
  • language:: This adjusts language-specific analysis settings.
  • strict-casts: true: If set to true, this rule warns you when your code contains "downcast" expressions that may fail at runtime.
  • strict-raw-types: true: If true, this statically checks that generic types have type annotations.
  • linter:: The linter section allows for the declaration of specific lint rules to be enforced.
  • rules:: Contains the list of lint rules that you wish to follow in your Flutter project.
  • cancel_subscriptions: This rule warns you if a Dart StreamSubscription is added to a class instance but not canceled in the same class, helping to prevent memory leaks.

Adding New Lints to the Package Guidelines

Dart’s lint ruleset is community-driven and primarily based on consensus. If you believe a particular lint rule should be a part of the package, the recommendation is to submit a lint proposal issue. The discussion within these issues allows for considerations of the benefits and risks from various angles before additions are made to the package.

This process helps manage the introduction of potentially disruptive, breaking changes that could arise from the addition of new lints. To keep disturbances low, lints aren’t added individually. Instead, they are added in batches after the review of all suggestions accumulated since the last review.

This method maintains a fair, democratic process in deciding what rules to enforce across the wider Dart community, making sure changes adhere to widely accepted standards and best practices.

Best Practices with Flutter Lint

Creating Custom Lint Rules

Indeed, if you’re interested in creating custom lint rules, you can consider using the custom_lint package. This package is authored by Remi Rousselet, who is also the creator of popular Flutter packages like provider and riverpod. The custom_lint package provides a unified, maintainable way to handle lint rules across multiple projects by allowing customization beyond the predefined lint rules.

Excluding code from analysis

  • Generated files
  • Test files

Customizing analysis rules

  • Ignoring rules
  • Changing the severity of rules

Better Lint Package

“very_good_analysis” and “flutter_lints” are both Flutter analysis packages that offer different code analysis and linting rules. The choice between them primarily depends on your project requirements and the coding style of your team.

In particular, “very_good_analysis” is more stringent than “flutter_lints”, making it a better choice for teams that aim for a higher standard of code quality and consistency. It helps identify potential programming errors, enforces a uniform programming style, and can help reduce code complexity.

“flutter_lints” is Flutter’s official linting suite with more basic rules, suited for a broad range of developers and projects. If your team is seeking a more in-depth and finely configured set of linting rules, then “very_good_analysis” might be a better fit.

However, for projects starting from scratch, your viewpoint that “very_good_analysis” might be better can be a sound argument. Starting with stringent lint rules allows for a strong foundational code quality from the beginning, potentially leading to a better maintainable code in the long run.

Regardless, whichever linting package is chosen, it’s crucial that the entire team understands the reasons behind the choice and are willing to adhere to the established rules. It is worth noting that more stringent rules might require more time to adapt to and correct the code; hence, the team’s needs and constraints should be thoroughly considered before making a choice.

White Better, Code Smarter.

--

--

Hamber

Flutter & Dart GDE | Web3 Advocate | Doting Daddy of a Cute 6-year-old Daughter