Ссылаться на:dart.cn/samples
Обзор языка программирования DART
Использование языка Dart, показанное в этой статье, не является исчерпывающим — это просто краткое введение для тех, кто предпочитает понимать язык на примере. ты мог быПамятка по Dart Language CodeLabили Обзор языка Dart и обзор библиотеки интересуют больше.
Обзор языка
Всесторонний обзор языка Dart с примерами. Большинство изчитать далееСсылки переходят к этому обзору.
Обзор библиотеки
Знакомит вас с основной библиотекой Dart на различных примерах. Используйте этот обзор, чтобы узнать больше о встроенных типах, коллекциях, дате и времени, асинхронных потоках и других основных функциях Dart.
Привет мир!
Каждое приложение имеетmain()
функция. Вы можете использовать функцию верхнего уровняprint()
для вывода фрагмента текста на консоль:
void main() {
print('Hello, World!');
}
Переменная
Хотя Dart является типобезопасным языком для кода, поскольку он поддерживает вывод типов, большинство переменных не нужно указывать явно:
var name = '旅行者一号';
var year = 1977;
var antennaDiameter = 3.7;
var flybyObjects = ['木星', '土星', '天王星', '海王星'];
var image = {
'tags': ['土星'],
'url': '//path/to/saturn.jpg'
};
Ты сможешь читать далееКонтент о переменных в Dart, включая их значения по умолчанию,final
и const
ключевые слова и статические типы и т. д.
оператор управления потоком
Dart поддерживает общие операторы управления потоком:
if (year >= 2001) {
print('21 世纪');
} else if (year >= 1901) {
print('20 世纪');
}
for (var object in flybyObjects) {
print(object);
}
for (int month = 1; month <= 12; month++) {
print(month);
}
while (year < 2016) {
year += 1;
}
Ты сможешь читать далееКонтент об операторах управления потоком в Dart, в том числеbreak
и continue
ключевые слова,switch
заявление иcase
оговорка иassert
утверждение.
функция
мы предлагаемУкажите типы для аргументов и возвращаемых значений каждой функции:
int fibonacci(int n) {
if (n == 0 || n == 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
var result = fibonacci(20);
=>
(жирная стрела) сокращение для функций, которые содержат только один оператор. Этот синтаксис полезен при передаче анонимных функций в качестве аргументов:
flybyObjects.where((name) => name.contains('土星')).forEach(print);
В дополнение к показу анонимной функции (в приведенном выше примере, переданной вwhere()
Параметр функции является анонимной функцией), он также показывает вам, как использовать функцию в качестве параметра: в приведенном выше примере используется функция верхнего уровня.print()
передается в качестве параметраforEach()
функция.
Ты сможешь читать далееСодержимое о функциях в Dart, включая необязательные параметры, значения параметров по умолчанию и лексическую область.
Примечания
Dart обычно использует двойную косую черту//
как начало комментария.
// 这是一个普通的单行注释。
/// 这是一个文档注释。
/// 文档注释用于为库、类以及类的成员添加注释。
/// 像 IDE 和 dartdoc 这样的工具可以专门处理文档注释。
/* 也可以像这样使用单斜杠和星号的注释方式 */
Ты сможешь читать далееВсе об аннотациях в Dart, в том числе о том, как работают инструменты документации.
Импорт ( Импорт )
использовать import
ключевое слово для доступа к API, определенным в других библиотеках.
// 导入核心库
import 'dart:math';
// 从外部 Package 中导入库
import 'package:test/test.dart';
// 导入文件
import 'path/to/my_other_file.dart';
Ты сможешь читать далееКонтент о библиотеках и видимости в Dart, включая префиксы библиотек,show
и hide
ключевые слова и черезdeferred
Ленивая загрузка реализаций ключевых слов.
Класс ( Класс )
В следующем примере показан класс с тремя свойствами, двумя конструкторами и одним методом. Одно из свойств не может быть назначено напрямую, поэтому оно определено как метод-геттер (вместо переменной).
class Spacecraft {
String name;
DateTime launchDate;
// 构造函数,带有可以直接为成员变量赋值的语法糖。
Spacecraft(this.name, this.launchDate) {
// 这里可以实现初始化代码。
}
// 命名构造函数,转发到默认构造函数。
Spacecraft.unlaunched(String name) : this(name, null);
int get launchYear =>
launchDate?.year; // 只读的非 final 的属性
// 方法。
void describe() {
print('宇宙飞船:$name');
if (launchDate != null) {
int years =
DateTime.now().difference(launchDate).inDays ~/
365;
print('发射时间:$launchYear ($years years ago)');
} else {
print('尚未发射');
}
}
}
Вы можете использовать, как показано нижеSpacecraft
своего рода:
var voyager = Spacecraft('旅行者一号', DateTime(1977, 9, 5));
voyager.describe();
var voyager3 = Spacecraft.unlaunched('旅行者三号');
voyager3.describe();
Ты сможешь читать далееКлассы в Dart, включая списки инициализаторов, опциональноnew
и const
ключевое слово, конструктор перенаправления, byfactory
Определяемые ключевыми словами фабричные конструкторы, методы Getter и Setter и т. д.
Расширение класса (наследование)
Dart поддерживает одиночное наследование.
class Orbiter extends Spacecraft {
double altitude;
Orbiter(String name, DateTime launchDate, this.altitude)
: super(name, launchDate);
}
Ты сможешь читать далееКонтент о наследовании классов в Dart, например необязательный@override
Аннотации и т. д.
Mixins
Примеси — это способ повторного использования кода в нескольких иерархиях классов. Вот как объявить Mixin:
mixin Piloted {
int astronauts = 1;
void describeCrew() {
print('宇航员人数:$astronauts');
}
}
Теперь вы можете добавлять функциональность этого класса в другие классы, просто наследуя от этого класса с помощью Mixin.
class PilotedCraft extends Spacecraft with Piloted {
// ···
}
С того времени,PilotedCraft
класс содержитastronauts
поля иdescribeCrew()
метод.
Ты сможешь читать далееКонтент о Mixin.
Интерфейсы и абстрактные классы
Дарт неinterface
ключевое слово. Вместо этого все классы неявно определяют интерфейс. Следовательно, любой класс может быть реализован как интерфейс.
class MockSpaceship implements Spacecraft {
// ···
}
Ты сможешь читать далееКое-что о неявных интерфейсах.
Вы можете создать абстрактный класс, который расширяется (или реализуется) любым конкретным классом. Абстрактные классы могут содержать абстрактные методы (методы без тел методов).
abstract class Describable {
void describe();
void describeWithEmphasis() {
print('=========');
describe();
print('=========');
}
}
любой расширяетDescribable
Классы имеютdescribeWithEmphasis()
метод, этот метод вызовет реализацию в классе реализацииdescribe()
метод.
Ты сможешь читать далееОб абстрактных классах и абстрактных методах.
асинхронный
использовать async
и await
Ключевые слова позволяют избежать ада обратного вызова и сделать ваш код более читабельным.
const oneSecond = Duration(seconds: 1);
// ···
Future<void> printWithDelay(String message) async {
await Future.delayed(oneSecond);
print(message);
}
Вышеупомянутый метод эквивалентен:
Future<void> printWithDelay(String message) {
return Future.delayed(oneSecond).then((_) {
print(message);
});
}
Как показано в следующем примере,async
и await
Ключевые слова помогают упростить чтение асинхронного кода.
Future<void> createDescriptions(Iterable<String> objects) async {
for (var object in objects) {
try {
var file = File('$object.txt');
if (await file.exists()) {
var modified = await file.lastModified();
print(
'文件 $object 已经存在。它上一次的修改时间为 $modified。');
continue;
}
await file.create();
await file.writeAsString('开始在此文件中描述 $object。');
} on IOException catch (e) {
print('不能为 $object 创建描述:$e');
}
}
}
Вы также можете использоватьasync*
ключевое слово, которое может предоставить вам более читаемый способ создания Stream.
Stream<String> report(Spacecraft craft, Iterable<String> objects) async* {
for (var object in objects) {
await Future.delayed(oneSecond);
yield '${craft.name} 由 $object 飞行。';
}
}
Ты сможешь читать далееО поддержке асинхронности, включая асинхронные функции,Future
,Stream
и асинхронный цикл (await for
).
аномальный
использовать throw
ключевое слово вызывает исключение:
if (astronauts == 0) {
throw StateError('没有宇航员。');
}
использовать try
сопоставление предложенийon
или catch
(Оба также могут использоваться вместе) ключевое слово для перехвата исключения:
try {
for (var object in flybyObjects) {
var description = await File('$object.txt').readAsString();
print(description);
}
} on IOException catch (e) {
print('无法描述该对象:$e');
} finally {
flybyObjects.clear();
}
Обратите внимание, что приведенный выше код является асинхронным; можно использовать как синхронный код, так и код в асинхронных функциях.try
Поймать исключение.
Ты сможешь читать далееОб исключениях, включая трассировку стека,rethrow
ключевые слова и разницу между ошибкой и исключением.
Другие источники
Обзор языка и Обзор библиотекиЕсть больше примеров кода в . Вы также можете проверитьDart API reference,, и в нем часто есть пример кода.