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)