Changing the execution flow of a program

Dart has the usual control structures with no surprises here (refer to control.dart).

The if…else statement (with an optional else) is as follows:

var n = 25;
if (n < 10) {
  print('1 digit number: $n');
} else if (n >=  10 && n < 100){
  print('2+ digit number: $n'); // 2+ digit number: 25
} else {
  print('3 or more digit number: $n');
}

Single-line statements without {} are allowed, but don't mix the two. A simple and short if…else statement can be replaced by a ternary operator (?…:), as shown in the following example code:

num rabbitCount = 16758;
(rabbitCount > 20000) ? print('enough for this year!') : print('breed on!');   // breed on!

If the expression before ? is true, the first statement is executed, else the statement after : is executed. To test whether a variable v refers to a real object, use: if (v != null) { … }.

Testing whether an object v is of type T is done with an if statement: if (v is T).

In this case, we can safely cast v to type T and access all of T's members:

if (v is T) {
  (v as T).methodOfT()
}

For example, if ba2 is not of type BankAccount, the code in line (1) of the following code will generate an error. We can avoid this with an if test in line (2):

var ba1, ba2;
ba1 = new BankAccount("Jeff", "5768-346-89", 758.0);
if (ba1 is BankAccount) ba1.deposit(42.0);
print('${ba1.balance}'); // 800.0
(ba2 as BankAccount).deposit(100.0); <-- NoSuchMethodError  (1)
if (ba2 is BankAccount) {                                   (2)
  (ba2 as BankAccount).deposit(100.0);
  print('deposited 100 on ba2'); // statement not reached
} else {
  print('ba2 is not a BankAccount'); // ba2 is not a BankAccount
}

We can replace multiple if...else if with a switch case statement; switch tests the value of an integer or String variable in () against different constant values in the case clauses:

switch(ba1.owner) {
  case 'Jeff':
    print('Jeff is the bank account owner'); // this is printed
    break;
  case 'Mary':
    print('Mary is the bank account owner');
    break;
  default:
    print('The bank account owner is not Jeff, nor Mary');
}

Each case must end with break or continue with a label; use default when no other case matches; multiple cases can be combined.

Repetition can be coded with a for loop if the number of repetitions is known or with a while or do...while loop if the looping depends on a condition:

var langs = ["Java","Python","Ruby", "Dart"];
for (int i = 0; i < langs.length; i++) {
  print('${langs[i]}');
}

Notice that the condition i value should be less than the length of the List.

If you don't need the i index, the for...in loop will provide a simpler alternative:

var s = '';
var numbers = [0, 1, 2, 3, 4, 5, 6, 7];
for (var n in numbers) {
  s = '$s$n ';
}
print(s);  // 0 1 2 3 4 5 6 7

In each loop, the n variable will take the value of the next collection element.

Conditions can also be tested in a while loop:

while (rabbitCount <= 20000) {
  print('keep breeding');
  rabbitCount += 4;
}

This is specifically the case when no counter is present.

Don't get involved in an infinite loop by forgetting a statement that changes the condition! You can always break out from a loop with a break statement:

while (true) {
  if (rabbitCount > 20000) break;
  rabbitCount += 4;
}

Likewise, skip the execution of the body of the loop with a continue statement:

s = '';
for (var n in numbers) {
  if (n % 2 == 0) continue; // skip even numbers
  s = '$s$n ';
}
print('$s');  // 1 3 5 7