Ссылаться на: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,, и в нем часто есть пример кода.