Dart Code Quality

Dart code quality (DCQ) is a collection of analyzer rules designed to aid in Dart, and Flutter development. Additionally popular frameworks such as Riverpod have their own rules.

Rules are separated into distinct categories:

  • Critical
  • Correctness
  • Maintainability
  • Performance
  • Style

Style rules are mostly recommended for ensuring homogeneity when working on a team. The rest can be used anywhere, and it's highly recommended to use the Critical rules.

Usage

Add the plugin and include the recommended preset in your analysis_options.yaml:

include: package:dart_code_quality/recommended.yaml

plugins:
  dart_code_quality: ^0.3.0

Configuring rules

Enable, disable, or configure individual rules via dart_code_quality: rules::

dart_code_quality:
  rules:
    # Disable a recommended rule
    avoid-non-null-assertion: false
    # Enable an opt-in rule
    prefer-conditional-expressions: true
    # Enable with options
    avoid-long-files:
      max-length: 200

Suppressing a diagnostic

// ignore: avoid-dynamic
dynamic x = 1;

Rule Groups

Group Description
Common General Dart rules — correctness, async safety, null safety, dead code
Flutter Widget lifecycle, state management, layout best practices
Riverpod Provider patterns, ref usage, notifier correctness
Equatable Props completeness, mixin usage
Easy Localization Missing tr calls
Intl Format patterns, intl name conventions
Fake Async Async callbacks in fakeAsync

See docs/rules.md for the full rule list.

Libraries

main
rules/common/arguments_ordering
rules/common/avoid_accessing_collections_by_constant_index
rules/common/avoid_accessing_other_classes_private_members
rules/common/avoid_adjacent_strings
rules/common/avoid_assigning_to_static_field
rules/common/avoid_assignments_as_conditions
rules/common/avoid_async_call_in_sync_function
rules/common/avoid_banned_annotations
rules/common/avoid_banned_exports
rules/common/avoid_banned_file_names
rules/common/avoid_banned_imports
rules/common/avoid_banned_names
rules/common/avoid_banned_types
rules/common/avoid_barrel_files
rules/common/avoid_bitwise_operators_with_booleans
rules/common/avoid_bottom_type_in_patterns
rules/common/avoid_bottom_type_in_records
rules/common/avoid_cascade_after_if_null
rules/common/avoid_casting_to_extension_type
rules/common/avoid_collapsible_if
rules/common/avoid_collection_equality_checks
rules/common/avoid_collection_mutating_methods
rules/common/avoid_commented_out_code
rules/common/avoid_complex_arithmetic_expressions
rules/common/avoid_complex_conditions
rules/common/avoid_complex_loop_conditions
rules/common/avoid_conditions_with_boolean_literals
rules/common/avoid_constant_assert_conditions
rules/common/avoid_constant_conditions
rules/common/avoid_constant_switches
rules/common/avoid_continue
rules/common/avoid_contradictory_expressions
rules/common/avoid_declaring_call_method
rules/common/avoid_default_tostring
rules/common/avoid_double_slash_imports
rules/common/avoid_duplicate_cascades
rules/common/avoid_duplicate_collection_elements
rules/common/avoid_duplicate_constant_values
rules/common/avoid_duplicate_exports
rules/common/avoid_duplicate_initializers
rules/common/avoid_duplicate_map_keys
rules/common/avoid_duplicate_mixins
rules/common/avoid_duplicate_named_imports
rules/common/avoid_duplicate_patterns
rules/common/avoid_duplicate_switch_case_conditions
rules/common/avoid_duplicate_test_assertions
rules/common/avoid_dynamic
rules/common/avoid_empty_spread
rules/common/avoid_empty_test_groups
rules/common/avoid_enum_values_by_index
rules/common/avoid_equal_expressions
rules/common/avoid_excessive_expressions
rules/common/avoid_explicit_pattern_field_name
rules/common/avoid_explicit_type_declaration
rules/common/avoid_extensions_on_records
rules/common/avoid_function_type_in_records
rules/common/avoid_future_ignore
rules/common/avoid_future_tostring
rules/common/avoid_generics_shadowing
rules/common/avoid_getter_prefix
rules/common/avoid_global_state
rules/common/avoid_high_cyclomatic_complexity
rules/common/avoid_identical_exception_handling_blocks
rules/common/avoid_if_with_many_branches
rules/common/avoid_ignoring_return_values
rules/common/avoid_immediately_invoked_functions
rules/common/avoid_implicitly_nullable_extension_types
rules/common/avoid_inconsistent_digit_separators
rules/common/avoid_incorrect_uri
rules/common/avoid_inferrable_type_arguments
rules/common/avoid_inverted_boolean_checks
rules/common/avoid_keywords_in_wildcard_pattern
rules/common/avoid_late_keyword
rules/common/avoid_local_functions
rules/common/avoid_long_files
rules/common/avoid_long_parameter_list
rules/common/avoid_long_records
rules/common/avoid_map_keys_contains
rules/common/avoid_missed_calls
rules/common/avoid_missing_completer_stack_trace
rules/common/avoid_missing_enum_constant_in_map
rules/common/avoid_missing_interpolation
rules/common/avoid_misused_set_literals
rules/common/avoid_misused_test_matchers
rules/common/avoid_misused_wildcard_pattern
rules/common/avoid_mixing_named_and_positional_fields
rules/common/avoid_multi_assignment
rules/common/avoid_mutating_parameters
rules/common/avoid_negated_conditions
rules/common/avoid_negations_in_equality_checks
rules/common/avoid_nested_assignments
rules/common/avoid_nested_conditional_expressions
rules/common/avoid_nested_extension_types
rules/common/avoid_nested_futures
rules/common/avoid_nested_records
rules/common/avoid_nested_shorthands
rules/common/avoid_nested_streams_and_futures
rules/common/avoid_nested_switch_expressions
rules/common/avoid_nested_switches
rules/common/avoid_nested_try_statements
rules/common/avoid_non_ascii_symbols
rules/common/avoid_non_empty_constructor_bodies
rules/common/avoid_non_final_exception_class_fields
rules/common/avoid_non_null_assertion
rules/common/avoid_not_encodable_in_to_json
rules/common/avoid_nullable_interpolation
rules/common/avoid_nullable_parameters_with_default_values
rules/common/avoid_nullable_tostring
rules/common/avoid_one_field_records
rules/common/avoid_only_rethrow
rules/common/avoid_passing_async_when_sync_expected
rules/common/avoid_passing_default_values
rules/common/avoid_passing_self_as_argument
rules/common/avoid_positional_record_field_access
rules/common/avoid_recursive_calls
rules/common/avoid_recursive_tostring
rules/common/avoid_redundant_else
rules/common/avoid_redundant_positional_field_name
rules/common/avoid_redundant_pragma_inline
rules/common/avoid_referencing_subclasses
rules/common/avoid_renaming_representation_getters
rules/common/avoid_returning_cascades
rules/common/avoid_returning_void
rules/common/avoid_self_compare
rules/common/avoid_shadowed_extension_methods
rules/common/avoid_shadowing
rules/common/avoid_similar_names
rules/common/avoid_single_field_destructuring
rules/common/avoid_slow_collection_methods
rules/common/avoid_stream_tostring
rules/common/avoid_substring
rules/common/avoid_suspicious_global_reference
rules/common/avoid_suspicious_super_overrides
rules/common/avoid_throw
rules/common/avoid_throw_in_catch_block
rules/common/avoid_throw_objects_without_tostring
rules/common/avoid_top_level_members_in_tests
rules/common/avoid_type_casts
rules/common/avoid_unassigned_fields
rules/common/avoid_unassigned_late_fields
rules/common/avoid_unassigned_local_variable
rules/common/avoid_unassigned_stream_subscriptions
rules/common/avoid_uncaught_future_errors
rules/common/avoid_unconditional_break
rules/common/avoid_unknown_pragma
rules/common/avoid_unnecessary_block
rules/common/avoid_unnecessary_call
rules/common/avoid_unnecessary_collections
rules/common/avoid_unnecessary_compare_to
rules/common/avoid_unnecessary_conditionals
rules/common/avoid_unnecessary_constructor
rules/common/avoid_unnecessary_continue
rules/common/avoid_unnecessary_digit_separators
rules/common/avoid_unnecessary_enum_arguments
rules/common/avoid_unnecessary_enum_prefix
rules/common/avoid_unnecessary_extends
rules/common/avoid_unnecessary_futures
rules/common/avoid_unnecessary_getter
rules/common/avoid_unnecessary_if
rules/common/avoid_unnecessary_late_fields
rules/common/avoid_unnecessary_length_check
rules/common/avoid_unnecessary_local_late
rules/common/avoid_unnecessary_local_variable
rules/common/avoid_unnecessary_negations
rules/common/avoid_unnecessary_null_aware_elements
rules/common/avoid_unnecessary_nullable_fields
rules/common/avoid_unnecessary_nullable_return_type
rules/common/avoid_unnecessary_patterns
rules/common/avoid_unnecessary_reassignment
rules/common/avoid_unnecessary_return
rules/common/avoid_unnecessary_super
rules/common/avoid_unnecessary_type_assertions
rules/common/avoid_unreachable_for_loop
rules/common/avoid_unrelated_type_assertions
rules/common/avoid_unrelated_type_casts
rules/common/avoid_unremovable_callbacks_in_listeners
rules/common/avoid_unsafe_collection_methods
rules/common/avoid_unsafe_reduce
rules/common/avoid_unused_after_null_check
rules/common/avoid_unused_assignment
rules/common/avoid_unused_generics
rules/common/avoid_unused_instances
rules/common/avoid_unused_parameters
rules/common/avoid_unused_rule_ignores
rules/common/avoid_weak_cryptographic_algorithms
rules/common/avoid_wildcard_cases_with_enums
rules/common/avoid_wildcard_cases_with_sealed_classes
rules/common/ban_name
rules/common/banned_usage
rules/common/binary_expression_operand_order
rules/common/dispose_class_fields
rules/common/double_literal_format
rules/common/enum_constants_ordering
rules/common/format_comment
rules/common/format_test_name
rules/common/function_always_returns_null
rules/common/function_always_returns_same_value
rules/common/handle_throwing_invocations
rules/common/map_keys_ordering
rules/common/match_base_class_default_value
rules/common/match_class_name_pattern
rules/common/match_getter_setter_field_names
rules/common/max_imports
rules/common/member_ordering
rules/common/missing_test_assertion
rules/common/move_records_to_typedefs
rules/common/move_variable_closer_to_its_usage
rules/common/move_variable_outside_iteration
rules/common/newline_before_case
rules/common/newline_before_constructor
rules/common/newline_before_method
rules/common/newline_before_return
rules/common/no_empty_block
rules/common/no_empty_string
rules/common/no_equal_arguments
rules/common/no_equal_conditions
rules/common/no_equal_nested_conditions
rules/common/no_equal_switch_expression_cases
rules/common/no_equal_then_else
rules/common/no_magic_number
rules/common/no_magic_string
rules/common/no_object_declaration
rules/common/parameters_ordering
rules/common/pass_optional_argument
rules/common/pattern_fields_ordering
rules/common/prefer_abstract_final_static_class
rules/common/prefer_add_all
rules/common/prefer_addition_subtraction_assignments
rules/common/prefer_any_or_every
rules/common/prefer_assigning_await_expressions
rules/common/prefer_async_await
rules/common/prefer_boolean_prefixes
rules/common/prefer_both_inlining_annotations
rules/common/prefer_class_destructuring
rules/common/prefer_commenting_future_delayed
rules/common/prefer_compound_assignment_operators
rules/common/prefer_conditional_expressions
rules/common/prefer_correct_callback_field_name
rules/common/prefer_correct_error_name
rules/common/prefer_correct_for_loop_increment
rules/common/prefer_correct_json_casts
rules/common/prefer_correct_setter_parameter_name
rules/common/prefer_correct_stream_return_type
rules/common/prefer_correct_switch_length
rules/common/prefer_correct_test_file_name
rules/common/prefer_correct_throws
rules/common/prefer_correct_type_name
rules/common/prefer_declaring_const_constructor
rules/common/prefer_digit_separators
rules/common/prefer_early_return
rules/common/prefer_enums_by_name
rules/common/prefer_expect_later
rules/common/prefer_explicit_function_type
rules/common/prefer_explicit_parameter_names
rules/common/prefer_explicit_type_arguments
rules/common/prefer_extracting_function_callbacks
rules/common/prefer_first
rules/common/prefer_for_in
rules/common/prefer_getter_over_method
rules/common/prefer_immediate_return
rules/common/prefer_iterable_of
rules/common/prefer_last
rules/common/prefer_match_file_name
rules/common/prefer_moving_to_variable
rules/common/prefer_named_boolean_parameters
rules/common/prefer_named_imports
rules/common/prefer_named_parameters
rules/common/prefer_named_record_fields
rules/common/prefer_non_nulls
rules/common/prefer_null_aware_elements
rules/common/prefer_null_aware_spread
rules/common/prefer_overriding_parent_equality
rules/common/prefer_parentheses_with_if_null
rules/common/prefer_prefixed_global_constants
rules/common/prefer_private_extension_type_field
rules/common/prefer_public_exception_classes
rules/common/prefer_pushing_conditional_expressions
rules/common/prefer_return_await
rules/common/prefer_returning_condition
rules/common/prefer_returning_conditional_expressions
rules/common/prefer_returning_shorthands
rules/common/prefer_shorthands_with_constructors
rules/common/prefer_shorthands_with_enums
rules/common/prefer_shorthands_with_static_fields
rules/common/prefer_simpler_boolean_expressions
rules/common/prefer_simpler_patterns_null_check
rules/common/prefer_single_declaration_per_file
rules/common/prefer_specific_cases_first
rules/common/prefer_specifying_future_value_type
rules/common/prefer_static_method
rules/common/prefer_switch_expression
rules/common/prefer_switch_with_enums
rules/common/prefer_switch_with_sealed_classes
rules/common/prefer_test_matchers
rules/common/prefer_test_structure
rules/common/prefer_type_over_var
rules/common/prefer_typedefs_for_callbacks
rules/common/prefer_unique_test_names
rules/common/prefer_unwrapping_future_or
rules/common/prefer_visible_for_testing_on_members
rules/common/prefer_wildcard_pattern
rules/common/record_fields_ordering
rules/common/tag_name
rules/common/use_existing_destructuring
rules/common/use_existing_variable
rules/easy_localization/avoid_missing_tr
rules/easy_localization/avoid_missing_tr_on_strings
rules/equatable/add_equatable_props
rules/equatable/list_all_equatable_fields
rules/equatable/prefer_equatable_mixin
rules/fake_async/avoid_async_callback_in_fake_async
rules/flutter/add_copy_with
rules/flutter/always_remove_listener
rules/flutter/avoid_border_all
rules/flutter/avoid_disposing_late_fields
rules/flutter/avoid_empty_setstate
rules/flutter/avoid_expanded_as_spacer
rules/flutter/avoid_flexible_outside_flex
rules/flutter/avoid_incomplete_copy_with
rules/flutter/avoid_incorrect_image_opacity
rules/flutter/avoid_inherited_widget_in_initstate
rules/flutter/avoid_late_context
rules/flutter/avoid_missing_controller
rules/flutter/avoid_missing_image_alt
rules/flutter/avoid_mounted_in_setstate
rules/flutter/avoid_recursive_widget_calls
rules/flutter/avoid_returning_widgets
rules/flutter/avoid_shrink_wrap_in_lists
rules/flutter/avoid_single_child_column_or_row
rules/flutter/avoid_state_constructors
rules/flutter/avoid_stateless_widget_initialized_fields
rules/flutter/avoid_undisposed_instances
rules/flutter/avoid_unnecessary_gesture_detector
rules/flutter/avoid_unnecessary_overrides_in_state
rules/flutter/avoid_unnecessary_setstate
rules/flutter/avoid_unnecessary_stateful_widgets
rules/flutter/avoid_wrapping_in_padding
rules/flutter/check_for_equals_in_render_object_setters
rules/flutter/consistent_update_render_object
rules/flutter/dispose_fields
rules/flutter/pass_existing_future_to_future_builder
rules/flutter/pass_existing_stream_to_stream_builder
rules/flutter/prefer_action_button_tooltip
rules/flutter/prefer_align_over_container
rules/flutter/prefer_center_over_align
rules/flutter/prefer_compute_over_isolate_run
rules/flutter/prefer_const_border_radius
rules/flutter/prefer_constrained_box_over_container
rules/flutter/prefer_container
rules/flutter/prefer_correct_edge_insets_constructor
rules/flutter/prefer_correct_static_icon_provider
rules/flutter/prefer_dedicated_media_query_methods
rules/flutter/prefer_define_hero_tag
rules/flutter/prefer_extracting_callbacks
rules/flutter/prefer_for_loop_in_children
rules/flutter/prefer_media_query_direct_access
rules/flutter/prefer_padding_over_container
rules/flutter/prefer_single_setstate
rules/flutter/prefer_single_widget_per_file
rules/flutter/prefer_sized_box_square
rules/flutter/prefer_using_list_view
rules/flutter/prefer_widget_private_members
rules/flutter/proper_super_calls
rules/flutter/use_closest_build_context
rules/flutter/use_setstate_synchronously
rules/intl/intl_utils
rules/intl/prefer_date_format
rules/intl/prefer_intl_name
rules/intl/prefer_number_format
rules/intl/prefer_providing_intl_description
rules/intl/prefer_providing_intl_examples
rules/intl/provide_correct_intl_args
rules/mocktail/avoid_implementation_in_mocks
rules/mocktail/pass_mock_object
rules/mocktail/prefer_correct_any_matcher
rules/mocktail/use_then_answer
rules/riverpod/avoid_assigning_notifiers
rules/riverpod/avoid_calling_notifier_members_inside_build
rules/riverpod/avoid_notifier_constructors
rules/riverpod/avoid_nullable_async_value_pattern
rules/riverpod/avoid_public_notifier_properties
rules/riverpod/avoid_ref_inside_state_dispose
rules/riverpod/avoid_ref_read_inside_build
rules/riverpod/avoid_ref_watch_outside_build
rules/riverpod/avoid_unnecessary_consumer_widgets
rules/riverpod/dispose_provided_instances
rules/riverpod/prefer_immutable_provider_arguments
rules/riverpod/use_ref_and_state_synchronously
rules/riverpod/use_ref_read_synchronously
rules/utils/config_utils
Type-safe helpers for reading rule configuration from analysis_options.yaml.
rules/utils/package_utils
Utilities for checking which package a type originates from.
rules/utils/ref_utils