«Практика разработки Flutter» Десять минут, чтобы начать работу с языком Dart

искусственный интеллект глубокое обучение

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