Publicado · en mejora
Guía de Dart · 2/6
Por ahora, este capítulo solo está disponible en inglés.
Dart's syntax is easy to read if you know C, Java or JavaScript. Blocks use curly braces and statements end with semicolons. This chapter covers variable declarations, functions, string interpolation, control flow and collection literals.
Dart is statically typed, but type inference is strong enough that you can omit most types. There are three ways to declare a variable.
| Keyword | Reassignable | Value fixed at |
|---|---|---|
var | Yes | Run time |
final | No (assigned once) | Run time |
const | No | Compile time |
void main() {
var count = 0; // inferred as int
count = count + 1; // can be reassigned
final now = DateTime.now(); // set once at run time
const maxUsers = 100; // compile-time constant
const colors = ['red', 'green']; // a deeply immutable constant list
String title = 'Dart'; // explicit types are fine too
late String description; // a promise to initialize before use
}The recommended style is final for local variables that are never reassigned and const for values known at compile time. late separates declaration from initialization; reading a late variable before it is set throws an error at run time.
Strings use single or double quotes (the official style prefers single). Embed values with $variable or ${expression}.
void main() {
final name = 'Hana';
final items = 3;
print('Hello, $name');
print('Your cart has ${items * 2} items');
print('Name length: ${name.length}');
final multiLine = '''
Multi-line strings
use triple quotes.
''';
final raw = r'C:\temp\$notInterpolated'; // the r prefix makes a raw string
}A function is declared with a return type, a name and a parameter list. When the body is a single expression, the arrow (=>) syntax shortens it.
int add(int a, int b) {
return a + b;
}
int square(int x) => x * x;
// Named parameters: braces, with required or a default value
String greet({required String name, String greeting = 'Hello'}) {
return '$greeting, $name!';
}
// Optional positional parameters: brackets, nullable type or default
String label(String text, [String? suffix]) {
return suffix == null ? text : '$text ($suffix)';
}
void main() {
print(add(2, 3)); // 5
print(square(4)); // 16
print(greet(name: 'Min')); // Hello, Min!
print(greet(greeting: 'Hi', name: 'Jiwoo'));
print(label('File')); // File
print(label('File', 'read-only')); // File (read-only)
}Named parameters are labeled at the call site, so order does not matter; most Flutter widget constructors use them. Functions are first-class values: you can store them in variables, pass them to other functions, and write anonymous functions such as (x) => x * 2.
if/else, for, while and do-while work as in other C-family languages. Conditions must be of type bool; zero or an empty string is never treated as false.
void main() {
final scores = [72, 95, 88];
for (var i = 0; i < scores.length; i++) {
print('#$i: ${scores[i]}');
}
for (final score in scores) {
if (score >= 90) {
print('$score: excellent');
} else if (score >= 80) {
print('$score: good');
} else {
print('$score: fair');
}
}
var n = 3;
while (n > 0) {
print(n--);
}
// A switch expression produces a value
final day = 6;
final kind = switch (day) {
6 || 7 => 'weekend',
>= 1 && <= 5 => 'weekday',
_ => 'unknown',
};
print(kind);
}Since Dart 3, a non-empty case in a switch statement does not fall through to the next one, so break is no longer required. In a switch expression each arm yields a value, and you can use patterns such as ||, relational comparisons and _ (match anything), as shown above. Patterns are covered in more detail in the next chapter.
A few operators make everyday code much shorter.
a ?? b: use b if a is null.a ??= b: assign b only if a is null.obj?.method(): skip the call and return null if obj is null.obj..a = 1..b(): a cascade that performs several operations on the same object.void main() {
String? nickname;
print(nickname ?? 'Guest'); // Guest
nickname ??= 'anon';
print(nickname.length); // 4 (now known to be non-null)
String? missing;
print(missing?.length); // null
final buffer = StringBuffer()
..write('Dart')
..write(' syntax')
..write(' notes');
print(buffer.toString());
}Lists use [], sets use {} with values, and maps use {} with key: value pairs. Inside a collection you can use if, for and the spread operator (...), which makes it easy to include items conditionally or merge other collections.
final isAdmin = true;
final base = ['Home', 'Search'];
final menu = [
...base,
if (isAdmin) 'Admin',
for (var i = 1; i <= 2; i++) 'Menu $i',
];
print(menu); // [Home, Search, Admin, Menu 1, Menu 2]
final tags = {'dart', 'flutter', 'dart'}; // Set: duplicates removed
final ages = {'Min': 31, 'Jiwoo': 27}; // Map<String, int>
final empty = <String>{}; // an empty set needs a type argument
print(tags.length); // 2
print(ages['Jiwoo']); // 27An empty {} is parsed as a map, so add a type argument such as <String>{} when you need an empty set.
Dart distinguishes variables with var, final and const, and interpolates strings with $ and ${}. Functions support named parameters, optional positional parameters and arrow syntax. Control flow resembles other C-family languages, with switch expressions and patterns on top. Learn ??, ?., cascades and collection if/for, and your code becomes shorter and easier to read.
0 comentarios
Iniciar sesión · Inicia sesión para dejar un comentario.
Sé el primero en comentar.