dart_style 1.2.10

The 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.

The formatter handles indentation, inline whitespace, and (by far the most difficult) intelligent line wrapping. It has no problems with nested collections, function expressions, long argument lists, or otherwise tricky code.

The formatter turns code like this:

// BEFORE formatting
if (tag=='style'||tag=='script'&&(type==null||type == TYPE_JS
  tag=='link'&&(rel=='stylesheet'||rel=='import')) {}


// AFTER formatting
if (tag == 'style' ||
  tag == 'script' &&
      (type == null || type == TYPE_JS || type == TYPE_DART) ||
  tag == 'link' && (rel == 'stylesheet' || rel == 'import')) {}

The formatter will never break your code—you can safely invoke it automatically from build and presubmit scripts.

Style fixes #

The formatter can also apply non-whitespace changes to make your code consistently idiomatic. You must opt into these by passing either --fix which applies all style fixes, or any of the --fix--prefixed flags to apply specific fixes.

For example, running with --fix-named-default-separator changes this:

greet(String name, {String title: "Captain"}) {
  print("Greetings, $title $name!");


greet(String name, {String title = "Captain"}) {
  print("Greetings, $title $name!");

Getting dartfmt #

Dartfmt is included in the Dart SDK, so most users get it directly from there. That has the latest version of dartfmt that was available when the SDK was released.

If you want to make sure you are running the latest version of dartfmt, you can globally activate the package from the dart_style package on pub.flutter-io.cn:

$ pub global activate dart_style
$ dartfmt ...

For this to work, you need to put pub's bin directory on your PATH before the Dart SDL directory. Otherwise, the SDK's dartfmt will shadow this one.

If you don't want pub to put dartfmt on your PATH, you can run it explicitly:

$ pub global activate dart_style --no-executables
$ pub global run dart_style:format ...

Using dartfmt #

IDEs and editors that support Dart usually provide easy ways to run the formatter. For example, in WebStorm you can right-click a .dart file and then choose Reformat with Dart Style.

Here's a simple example of using dartfmt on the command line:

$ dartfmt test.dart

This command formats the test.dart file and writes the result to standard output.

Dartfmt takes a list of paths, which can point to directories or files. If the path is a directory, it processes every .dart file in that directory or any of its subdirectories. If no file or directory is specified, dartfmt reads from standard input.

By default, it formats each file and just prints the resulting code to stdout. If you pass -w, it overwrites your existing files with the formatted results.

You may pass a -l option to control the width of the page that it wraps lines to fit within, but you're strongly encouraged to keep the default line length of 80 columns.

Validating files #

If you want to use the formatter in something like a presubmit script or commit hook, you can use the -n dry run option. If you specify -n, the formatter prints the paths of the files whose contents would change if the formatter were run normally. If it prints no output, then everything is already correctly formatted.

Using the dart_style API #

The package also exposes a single dart_style library containing a programmatic API for formatting code. Simple usage looks like this:

import 'package:dart_style/dart_style.dart';

main() {
  var formatter = new DartFormatter();

  try {
    library an_entire_compilation_unit;

    class SomeClass {}

  } on FormatterException catch (ex) {

Other resources #

  • Before sending an email, see if you are asking a frequently asked question.

  • Before filing a bug, or if you want to understand how work on the formatter is managed, see how we track issues.

1.2.10 #

  • Format null assertion operators.
  • Better formatting for invocation expressions inside method call chains.
  • Support package:analyzer 0.38.0.

1.2.9 #

  • Support package:analyzer 0.37.0.

1.2.8 #

  • Better indentation of function expressions inside trailing comma argument lists. (Thanks a14@!)
  • Avoid needless indentation on chained if-else elements (#813).

1.2.7 #

  • Improve indentation of adjacent strings inside => functions.

1.2.6 #

  • Properly format trailing commas in assertions.

  • Improve indentation of adjacent strings. This fixes a regression introduced in 1.2.5 and hopefully makes adjacent strings generally look better.

    Adjacent strings in argument lists now format the same regardless of whether the argument list contains a trailing comma. The rule is that if the argument list contains no other strings, then the adjacent strings do not get extra indentation. This keeps them lined up when doing so is unlikely to be confused as showing separate independent string arguments.

    Previously, adjacent strings were never indented in argument lists without a trailing comma and always in argument lists that did. With this change, adjacent strings are still always indented in collection literals because readers are likely to interpret a series of unindented lines there as showing separate collection elements.

1.2.5 #

  • Add support for spreads inside collections (#778).
  • Add support for if and for elements inside collections (#779).
  • Require at least Dart 2.1.0.
  • Require analyzer 0.36.0.

1.2.4 #

  • Update to latest analyzer package AST API.
  • Tweak set literal formatting to follow other collection literals.

1.2.3 #

  • Update package:analyzer constraint to '>=0.33.0 <0.36.0'.

1.2.2 #

  • Support set literals (#751).

1.2.1 #

  • Add --fix-function-typedefs to convert the old typedef syntax for function types to the new preferred syntax.

1.2.0 #

  • Add --stdin-name to specify name shown when reading from stdin (#739).
  • Add --fix-doc-comments to turn /** ... */ doc comments into /// (#730).
  • Add support for new mixin syntax (#727).
  • Remove const in all metadata annotations with --fix-optional-const` (#720).

1.1.4 #

  • Internal changes to support using the new common front end for parsing.

1.1.3 #

  • Preserve whitespace in multi-line strings inside string interpolations (#711). Note! This bug means that dart_style 1.1.2 may make semantics changes to your strings. You should avoid that version and use 1.1.3.

  • Set max SDK version to <3.0.0, and adjusted other dependencies.

1.1.2 #

  • Don't split inside string interpolations.

1.1.1 #

  • Format expressions in string interpolations (#226).
  • Apply fixes inside string interpolations (#707).

1.1.0 #

  • Add support for "style fixes", opt-in non-whitespace changes.
  • Add fix to convert : to = as the named parameter default value separator.
  • Add fix to remove new keywords.
  • Add fix to remove unneeded const keywords.
  • Uniformly format constructor invocations and other static method calls.
  • Don't crash when showing parse errors in Dart 2 mode (#697).

1.0.14 #

  • Support metadata on enum cases (#688).

1.0.13 #

  • Support the latest release of package:analyzer.

1.0.12 #

  • Fix another failure when running in Dart 2.

1.0.11 #

  • Fix cast failure when running in Dart 2.
  • Updated SDK version to 2.0.0-dev.17.0.
  • Force split in empty then block in if with an else (#680).

1.0.10 #

  • Don't split before . if the target expression is an argument list with a trailing comma (#548, #665).
  • Preserve metadata on for-in variables (#648).
  • Support optional new/const (#652).
  • Better formatting of initialization lists after trailing commas (#658).

1.0.9 #

  • Updated tests. No user-facing changes.

1.0.8 #

  • Support v1 of pkg/args.

1.0.7 #

  • Format multiline strings as block arguments (#570).
  • Fix call to analyzer API.
  • Support assert in initializer list experimental syntax (#522).

1.0.6 #

  • Support URIs in part-of directives (#615).

1.0.5 #

  • Support the latest version of pkg/analyzer.

1.0.4 #

  • Ensure formatter throws an exception instead of introducing non-whitespace changes. This sanity check ensures the formatter does not erase user code when the formatter itself contains a bug.
  • Preserve type arguments in generic typedefs (#619).
  • Preserve type arguments in function expression invocations (#621).

1.0.3 #

  • Preserve type arguments in generic function-typed parameters (#613).

1.0.2 #

  • Support new generic function typedef syntax (#563).

1.0.1 #

  • Ensure space between - and -- (#170).
  • Preserve a blank line between enum cases (#606).

1.0.0 #

  • Handle mixed block and arrow bodied function arguments uniformly (#500).
  • Don't add a spurious space after "native" (#541).
  • Handle parenthesized and immediately invoked functions in argument lists like other function literals (#566).
  • Preserve a blank line between an annotation and the first directive (#571).
  • Fix splitting in generic methods with => bodies (#584).
  • Allow splitting between a parameter name and type (#585).
  • Don't split after < when a collection is in statement position (#589).
  • Force a split if the cascade target has non-obvious precedence (#590).
  • Split more often if a cascade target contains a split (#591).
  • Correctly report unchanged formatting when reading from stdin.

0.2.16 #

  • Don't discard type arguments on method calls with closure arguments (#582).

0.2.15 #

  • Support covariant modifier on methods.

0.2.14 #

  • Update to analyzer 0.29.3. This should make dart_style a little more resilient to breaking changes in analyzer that add support for new syntax that dart_style can't format yet.

0.2.13 #

  • Support generic method parameters as well as arguments.

0.2.12 #

  • Add support for assert() in constructor initializers.
  • Correctly indent the right-hand side of is and as expressions.
  • Avoid splitting in index operators when possible.
  • Support generic methods (#556).

0.2.11+1 #

  • Fix test to not depend on analyzer error message.

0.2.11 #

  • Widen dependency on analyzer to allow 0.29.x.

0.2.10 #

  • Handle metadata annotations before parameters with trailing commas (#520).
  • Always split enum declarations if they end in a trailing comma (#529).
  • Add --set-exit-if-changed to set the exit code on a change (#365).

0.2.9 #

  • Require analyzer 0.27.4, which makes trailing commas on by default.

0.2.8 #

  • Format parameter lists with trailing commas like argument lists (#447).

0.2.7 #

  • Make it strong mode clean.
  • Put labels on their own line (#43).
  • Gracefully handle IO errors when failing to overwrite a file (#473).
  • Add a blank line after local functions, to match top level ones (#488).
  • Improve indentation in non-block-bodied control flow statements (#494).
  • Better indentation on very long return types (#503).
  • When calling from JS, guess at which error to show when the code cannot be parsed (#504).
  • Force a conditional operator to split if the condition does (#506).
  • Preserve trailing commas in argument and parameter lists (#509).
  • Split arguments preceded by comments (#511).
  • Remove newlines after script tags (#513).
  • Split before a single named argument if the argument itself splits (#514).
  • Indent initializers in multiple variable declarations.
  • Avoid passing an invalid Windows file URI to analyzer.
  • Always split comma-separated sequences that contain a trailing comma.

0.2.6 #

  • Support deploying an npm package exporting a formatCode method.

0.2.4 #

  • Better handling for long collections with comments (#484).

0.2.3 #

  • Support messages in assert() (#411).
  • Don't put spaces around magic generic method annotation comments (#477).
  • Always put member metadata annotations on their own line (#483).
  • Indent functions in named argument lists with non-functions (#478).
  • Force the parameter list to split if a split occurs inside a function-typed parameter.
  • Don't force a split for before a single named argument if the argument itself splits.

0.2.2 #

  • Upgrade to analyzer 0.27.0.
  • Format configured imports and exports.

0.2.1 #

  • --version command line argument (#240).
  • Split the first . in a method chain if the target splits (#255).
  • Don't collapse states that differ by unbound rule constraints (#424).
  • Better handling for functions in method chains (#367, #398).
  • Better handling of large parameter metadata annotations (#387, #444).
  • Smarter splitting around collections in named parameters (#394).
  • Split calls if properties in a chain split (#399).
  • Don't allow splitting inside empty functions (#404).
  • Consider a rule live if it constrains a rule in the overflow line (#407).
  • Allow splitting in prefix expressions (#410).
  • Correctly constrain collections in argument lists (#420, #463, #465).
  • Better indentation of collection literals (#421, #469).
  • Only show a hidden directory once in the output (#428).
  • Allow splitting between type and variable name (#429, #439, #454).
  • Better indentation for binary operators in => bodies (#434.
  • Tweak splitting around assignment (#436, #437).
  • Indent multi-line collections in default values (#441).
  • Don't drop metadata on part directives (#443).
  • Handle if statements without curly bodies better (#448).
  • Handle loop statements without curly bodies better (#449).
  • Allow splitting before get and set (#462).
  • Add --indent to specify leading indent (#464).
  • Ensure collection elements line split separately (#474).
  • Allow redirecting constructors to wrap (#475).
  • Handle index expressions in the middle of call chains.
  • Optimize splitting lines with many rules.

0.2.0 #

  • Treat functions nested inside function calls like block arguments (#366).

0.2.0-rc.4 #

  • Smarter indentation for function arguments (#369).

0.2.0-rc.3 #

  • Optimize splitting complex lines (#391).

0.2.0-rc.2 #

  • Allow splitting between adjacent strings (#201).
  • Force multi-line comments to the next line (#241).
  • Better splitting in metadata annotations in parameter lists (#247).
  • New optimized line splitter (#360, #380).
  • Allow splitting after argument name (#368).
  • Parsing a statement fails if there is unconsumed input (#372).
  • Don't force for fully split if initializers or updaters do (#375, #377).
  • Split before deferred (#381).
  • Allow splitting on as and is expressions (#384).
  • Support null-aware operators (?., ??, and ??=) (#385).
  • Allow splitting before default parameter values (#389).

0.2.0-rc.1 #

  • BREAKING: The indent argument to new DartFormatter() is now a number of spaces, not indentation levels.

  • This version introduces a new n-way constraint system replacing the previous binary constraints. It's mostly an internal change, but allows us to fix a number of bugs that the old solver couldn't express solutions to.

    In particular, it forces argument and parameter lists to go one-per-line if they don't all fit in two lines. And it allows function and collection literals inside expressions to indent like expressions in some contexts. (#78, #97, #101, #123, #139, #141, #142, #143, et. al.)

  • Indent cascades more deeply when the receiver is a method call (#137).

  • Preserve newlines in collections containing line comments (#139).

  • Allow multiple variable declarations on one line if they fit (#155).

  • Prefer splitting at "." on non-identifier method targets (#161).

  • Enforce a blank line before and after classes (#168).

  • More precisely control newlines between declarations (#173).

  • Preserve mandatory newlines in inline block comments (#178).

  • Splitting inside type parameter and type argument lists (#184).

  • Nest blocks deeper inside a wrapped conditional operator (#186).

  • Split named arguments if the positional arguments split (#189).

  • Re-indent line doc comments even if they are flush left (#192).

  • Nest cascades like expressions (#200, #203, #205, #221, #236).

  • Prefer splitting after => over other options (#217).

  • Nested non-empty collections force surrounding ones to split (#223).

  • Allow splitting inside with and implements clauses (#228, #259).

  • Allow splitting after = in a constructor initializer (#242).

  • If a => function's parameters split, split after the => too (#250).

  • Allow splitting between successive index operators (#256).

  • Correctly indent wrapped constructor initializers (#257).

  • Set failure exit code for malformed input when reading from stdin (#359).

  • Do not nest blocks inside single-argument function and method calls.

  • Do nest blocks inside => functions.

0.1.8+2 #

  • Allow using analyzer 0.26.0-alpha.0.

0.1.8+1 #

  • Use the new test package runner internally.

0.1.8 #

  • Update to latest analyzer and args packages.
  • Allow cascades with repeated method names to be one line.

0.1.7 #

  • Update to latest analyzer (#177).
  • Don't discard annotations on initializing formals (#197).
  • Optimize formatting deeply nested expressions (#108).
  • Discard unused nesting level to improve performance (#108).
  • Discard unused spans to improve performance (#108).
  • Harden splits that contain too much nesting (#108).
  • Try to avoid splitting single-element lists (#211).
  • Avoid splitting when the first argument is a function expression (#211).

0.1.6 #

  • Allow passing in selection to preserve through command line (#194).

0.1.5+1, 0.1.5+2, 0.1.5+3 #

  • Fix test files to work in main Dart repo test runner.

0.1.5 #

  • Change executable name from dartformat to dartfmt.

0.1.4 #

  • Don't mangle comma after function-typed initializing formal (#156).
  • Add --dry-run option to show files that need formatting (#67).
  • Try to avoid splitting in before index argument (#158, #160).
  • Support await for statements (#154).
  • Don't delete commas between enum values with doc comments (#171).
  • Put a space between nested unary - calls (#170).
  • Allow -t flag to preserve compatibility with old formatter (#166).
  • Support --machine flag for machine-readable output (#164).
  • If no paths are provided, read source from stdin (#165).

0.1.3 #

  • Split different operators with the same precedence equally (#130).
  • No spaces for empty for loop clauses (#132).
  • Don't touch files whose contents did not change (#127).
  • Skip formatting files in hidden directories (#125).
  • Don't include trailing whitespace when preserving selection (#124).
  • Force constructor initialization lists to their own line if the parameter list is split across multiple lines (#151).
  • Allow splitting in index operator calls (#140).
  • Handle sync* and async* syntax (#151).
  • Indent the parameter list more if the body is a wrapped "=>" (#144).

0.1.2 #

  • Move split conditional operators to the beginning of the next line.

0.1.1 #

  • Support formatting enums (#120).
  • Handle Windows line endings in multiline strings (#126).
  • Increase nesting for conditional operators (#122).

Use this package as an executable

1. Install it

You can install the package from the command line:

$ pub global activate dart_style

2. Use it

The package has the following executables:

$ dartfmt
$ dartformat

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:

  dart_style: ^1.2.10

2. Install it

You can install packages from the command line:

with pub:

$ pub get

with Flutter:

$ flutter pub get

Alternatively, your editor might support pub get or flutter pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:

import 'package:dart_style/dart_style.dart';
Describes how popular the package is relative to other packages. [more]
Code health derived from static analysis. [more]
Reflects how tidy and up-to-date the package is. [more]
Weighted score of the above. [more]
Learn more about scoring.

We analyzed this package on Sep 17, 2019, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.5.0
  • pana: 0.12.21


Detected platforms: Flutter, other

Primary library: package:dart_style/dart_style.dart with components: io.

Maintenance suggestions

Maintain an example.

None of the files in the package's example/ directory matches known example patterns.

Common filename patterns include main.dart, example.dart, and dart_style.dart. Packages with multiple examples should provide example/README.md.

For more information see the pub package layout conventions.


Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.3.0 <3.0.0
analyzer >=0.37.0 <0.39.0 0.38.2
args >=0.12.1 <2.0.0 1.5.2
path ^1.0.0 1.6.4
source_span ^1.4.0 1.5.5
Transitive dependencies
async 2.3.0
charcode 1.1.2
collection 1.14.12
convert 2.1.1
crypto 2.1.3
csslib 0.16.1
front_end 0.1.24
glob 1.1.7
html 0.14.0+2
kernel 0.3.24
meta 1.1.7
package_config 1.1.0
string_scanner 1.0.5
term_glyph 1.1.0
typed_data 1.1.6
watcher 0.9.7+12
Dev dependencies
grinder ^0.8.0
pedantic ^1.0.0 1.8.0+1
pub_semver ^1.2.3 1.4.2
test ^1.6.0
test_descriptor ^1.0.0
test_process ^1.0.0
yaml ^2.0.0 2.1.16