How do method cascades work exactly in dart?

A..B().C() means calling B() on A, then calling C() based on the return value of A.B().

A..B().C()..D().E() means calling B() on A, then calling C() based on the return value of A.B(), assume it is A_B, then calling D() on A_B, i.e. A_B.D(), assume the return value of it is A_B_D, then finally do A_B_D.E().


As pointed in the official Dart language article Method Cascades in Dart:

The ".." syntax invokes a method (or setter or getter) but discards the result, and returns the original receiver instead.

In brief, method cascades provide a syntactic sugar for situations where the receiver of a method invocation might otherwise have to be repeated.

Below are example based/copied from the previously cited article. For further information, go read it.

add() example

In the scenario where one want to add multiple elements to a list, the legacy-way is to do multiple assignements :

myList.add("item1");
myList.add("item2");
// add again and again…
myList.add("itemN");

While you can't do something like myList.add("item1").add("item1")….add("itemN"); as the add() does not method return the myList object but a void, you can use the cascading operator instead as it discards the result, and returns the original receiver myList :

myList..add("item1")..add("item2")…..add("itemN");
myList.add("item1").add("item2")….add("itemN");

Another example

So Instead of writing:

var address = getAddress();
address.setStreet(“Elm”, “13a”);
address.city = “Carthage”;
address.state = “Eurasia”
address.zip(66666, extended: 6666);

One may write

getAddress()
 ..setStreet(“Elm”, “13a”)
 ..city = “Carthage”
 ..state = “Eurasia”
 ..zip(66666, extended: 6666);

You can read the article from Gilad Bracha : Method Cascades in Dart. At its ends, you will see many examples.

See also this answer of Lasse Nielsen about operator precedence :

It helps to think of ".." as not really an operator, but more like a scoping construct (like parentheses). It creates a new scope from the ".." to either the next "..", or the first other scope delimiter (";", ")", "}" or similar).

Basically, a..b().c() is the same as (t){t.b().c(); return t;}(a)