# Dart cheatsheet

## Loop Syntax

for (int i=0; i<10; i++){
// do something
}

int i = 0;
while (i++ < 10){
// do something
}


## String Interpolation

var name = "Hoani";
var age = 33;
print("$name is$age."); // Hoani is 33.


With a struct, we need to use ${}: var user = Person(name: "Hoani", age: 33); print("${user.name} is ${user.age}.");  ## Variable Declarations int i = 0; String product = "shampoo"; double price = 3.99;  The type can be inferred using var: var i = 0; var product = "shampoo"; var price = 3.99;  final declares immutable values: final mass = 5.972e24; final planet = "Earth";  dynamic is used for variables whose type is not known: dynamic code = 1234; code = "abcd";  ## Functions void doSomething() { // do something. } String formatProduct(Product product) { return "${product.name} costs ${product.price}"; }  Optional arguments: // formatPlanet("Earth", 5.972e24); // -> "Planet Earth, mass: 5.972e+24kg" // formatPlanet("Mars"); // -> "Planet Mars" String formatPlanet(String name, [double mass=0.0]) { return "Planet$name" +
((mass <= 0.0) ? "" : ", mass: $masskg"); }  Named arguments: // formatPlanet("Earth", mass: 5.972e24); // -> "Planet Earth, mass: 5.972e+24kg" // formatPlanet("Mars"); // -> "Planet Mars" String formatPlanet(String name, {double mass=0.0}) { return "Planet$name" +
((mass <= 0.0) ? "" : ", mass: $masskg"); }  Anonymous functions: (String name) => "Planet$name";


## Lists

var fibonacci = [0, 1, 1, 2, 3, 5, 8];


Explicit type declaration:

List<int> fibonacci = [0, 1, 1, 2, 3, 5, 8];


Iterate through a list:

for (int value in fibonacci) {
print(value);
}


Using fold to sum a list:

int sum = fibonacci.fold(0, (int s, int v) => s + v);


## Map syntax

var users = {
'Steve': Person('Steve', age: 37),
'Dave': Person('Dave', age: 27),
};

var user = users["Steve"]; // Person('Steve', age: 37);
var user = users["Kelly"]; // null;


Explicit type declaration:

Map<String, Person> users = {
'Steve': Person('Steve', age: 37),
'Dave': Person('Dave', age: 27),
};


Iterating through a map:

for (String key in users.keys) {
print("$key"); }  ## Classes Simple struct-like class: class Person{ String name = "noone"; int age = 0; } var user = Person(); user.name = "Hoani"; user.age = 33;  Class with constructor and immutable fields: class Person{ Person(this.name, this.age); final String name; final int age; } var user = Person("Hoani", 33);  ### Member Functions class Person{ Person(this.name, this.age); final String name; final int age; String toString() => "$name is $age."; } var user = Person("Hoani", 33); print(user); // Calls toString, prints "Hoani is 33."  ### Private fields and functions class Person{ Person(this._name, this._age); final String _name; // Private final int _age; // Private String toString() => "$_name is ${_printAge()}."; String _printAge() => "$_age years old"; // Private
}

var user = Person("Hoani", 33);
print(user); // Prints "Hoani is 33 years old."


### Inheritance

class CatOwner extends Person{
CatOwner(String name, int age, this._catName) :
super(name, age);

final String _catName;

String toString() => super.toString() +
" His cat is \$_catName.";
}

var user = CatOwner("Hoani", 33, "Indie");
print(user); // "Hoani is 33 years old. His cat is Indie."


### Abstract Classes

abstract class Vector {
double distance();
int dimensions();
}

class Vector3 implements Vector {
Vector3(this.x, this.y, this.z);

double x = 0.0, y = 0.0, z = 0.0;

double distance() => sqrt(x * x + y * y + z * z);
int dimensions() => 3;
}


### Computed Properties

abstract class Vector {
double get distance;
int get dimensions;
}

class Vector3 implements Vector {
Vector3(this.x, this.y, this.z);

double x = 0.0, y = 0.0, z = 0.0;

double get distance => sqrt(x * x + y * y + z * z);
int get dimensions => 3;
}


### Mixins

Mixins extend the functionality of classes.

mixin Discount {
double applyDiscount(double price, double percent) {
return price * (1.0 - (percent/100.0));
}
}

class StoreItem with Discount {
// ...
double get price => applyDiscount(_basePrice, _discount);
}


## Enums

enum Command {
Sit,
RollOver,
};

void handleCommand(Command cmd) {
switch (cmd) {
case Command.Sit:
// do sit
break;
case Command.Rollover:
// do rollover
break;
default:
print("Unknown Command");
break;
}
}


## Streams

import 'dart:async';

void main() {
final controller = StreamController();

controller.close();

controller.stream.listen(
(v)            => print(v),
onError: (err) => print("Error: \t" + err.toString()),
onDone: ()     => print("stream closed"),
);
}


Output:

Hello
null
1234
Error: 	Bad state: something went wrong
stream closed


Categories:

Updated: