Переход к подробной дорожной карте:
Dart Language — быстрый старт за 45 минут (часть 1)
Dart Language — быстрый старт за 45 минут (часть 2)
Полное понимание асинхронного программирования Dart
Подробное объяснение асинхронного потока языка Dart
Стандартные потоковые и файловые операции языка Dart
Дартс Сетевое Программирование
Опыт разработки краулеров Dart
Разработка сервера с полным стеком Dart
Dart FFI называет смешанное программирование на языке C
Взаимный звонок между Dart и Lua в LuaDardo
Следуй за мной, не пропусти!
предисловие
После того, как Google запустила кроссплатформенный фреймворк пользовательского интерфейса Flutter, он оказал новое влияние на разработку мобильных терминалов.Flutter был разработан на языке Dart, и почему Flutter выбрал язык Dart в качестве единственного языка разработки? В целом он имеет следующие преимущества
- Dart может быть скомпилирован на основе AOT (Ahead Of Time), то есть скомпилирован в собственный код платформы, с высокой производительностью.
- Dart также может быть скомпилирован на основе JIT (Just In Time) с быстрой компиляцией и горячей перезагрузкой, что удваивает цикл разработки (горячая перезагрузка Flutter с сохранением состояния за доли секунды).
- Dart упрощает создание плавных анимаций и переходов со скоростью 60 кадров в секунду. Dart выполняет выделение объектов и сборку мусора без блокировок
- Синтаксис Dart сочетает в себе характеристики синтаксиса Java и JavaScript, и практически отсутствует неудобный странный синтаксис, что позволяет Java-программистам чувствовать себя более дружелюбно и быстро приступать к работе.
Вообще говоря, язык либо скомпилирован с помощью AOT, который компилируется медленно и имеет низкую эффективность разработки, либо скомпилирован с помощью JIT и скомпилирован во время выполнения.Хотя его можно перезагружать в горячем режиме, эффективность выполнения низкая, и Dart изменил ситуацию. между ними. Идеальный баланс, при разработке с использованием JIT-компиляции, отладка выполняется быстро, что вы видите, то и получаете, а эффективность разработки высока. Когда он выпущен, он скомпилирован с использованием AOT и скомпилирован в собственный код целевая платформа, а эффективность выполнения высока.
Подготовка окружающей среды
Установить Дарт SDK
Официальный адрес загрузкиЕсть три версии SDK на выбор
- Flutter
- Web
- Server
Эта глава используется только в качестве синтаксиса программирования Dart для изучения, рекомендуется установить здесьServerверсии SDK, а затем выберите версию Windows для загрузки.
Настроить переменные среды
В Windows вы можете установить его, нажав Далее.После завершения установки вам нужноdart-sdk
внизbin
Каталог добавляется в системную переменную среды Path. Этот шаг является обычным шагом настройки команды.
Настройте редактор VSCode
В качестве изучения языка Dart не рекомендуется скачивать громоздкую IDE, обеспечена официальная поддержка плагина редактора VSCode, для изучения рекомендуется использовать VSCode.
отЗагрузка с официального сайтаРедактор VSCode, после завершения установки запустите VSCode и найдите Dart в магазине плагинов, чтобы установить плагин.
тестовая среда
Создайте новый в VSCodetest.dart
файл, напишите следующий код
void main(){
print("hello world!");
}
После запуска он успешно выводится в консольhello world!
Базовая грамматика
комментарии к коду
Комментарии к коду в Dart в основном такие же, как и в языке Java.
// 单行注释
/*
* 多行注释
*/
/**
* 文档注释
*/
/// 使用三个斜杠开头
/// 这是Dart特有的文档注释
Встроенные типы данных
В Dart все, на что можно сослаться с помощью переменной, является объектом, и каждый объект является экземпляром класса. числа, функции и
null
также являются объектами. Все объекты наследуются от класса Object.
Обратите внимание, что неинициализированные переменные по умолчаниюnull
. Значение по умолчанию для переменной числового типа такжеnull
.
Числовой типnum
Есть два конкретных подкласса, а именноint
а такжеdouble
,вint
представляет собой целое значение в диапазоне-2^53
к2^53
между;double
Это 64-битное число двойной точности с плавающей запятой.
Переменные и константы
определить переменную
В Dart существует два способа определения переменных: один из них обычно используется в языках со статической типизацией, в котором явно указывается тип переменной, а другой — в динамических языках, который автоматически выводится vm без указания типа.
// 1.通过显式指定类型来定义变量
String name = "张三";
num age = 18;
// 2.使用关键字var,不指定类型
var address = "深南大道";
var id = 100;
/* 使用var定义变量,即使未显式指定类型,一旦赋值后类型就被固定
* 因此使用var定义的变量不能改变数据类型
*/
var number = 19;
// 以下代码错误,无法运行,number变量已确定为int类型
number = "2019";
Чтобы динамически изменить тип данных переменной, вы должны использоватьdynamic
илиObject
для определения переменных.
// dynamic声明变量
dynamic var1 = "hello";
var1 = 19;
print(var1); // 19
// Object声明变量
Object var2 = 20;
var2 = "Alice";
print(var2); // Alice
При написании кода рекомендуется указывать типы переменных как можно явнее, что может улучшить читаемость кода и упростить отладку.
определить константы
Есть также два способа определения констант в Dart, один используетfinal
Ключевое слово, как и в Java, переменная final может быть назначена только один раз; другой метод — это метод Dart, использующийconst
Определения ключевых слов.
// 1.使用final关键字定义常量
final height = 10;
// 2.使用const关键字定义常量
const pi = 3.14;
требует внимания,final
Определенные константы являются константами времени выполнения, аconst
Константы - это константы времени компиляции, т.е.final
При определении константы ее значение может быть переменной, аconst
Определенная константа, значение которой должно быть буквальным постоянным значением.
final time = new DateTime.now(); // 正确
const time = new DateTime.now(); // 错误
const list = const[1,2,3]; // 正确
const list = [1,2,3]; // 错误
Общие операции для встроенных типов
Числовой тип
// String 转 int
var one = int.parse('1');
// String 转 double
var onePointOne = double.parse('1.1');
// int 转 String
String oneAsStr = 1.toString();
// double 转 String
String piAsStr = 3.14159.toStringAsFixed(2); // 保留两位 '3.14'
// Dart也支持整数位操作,<<、 >>、&、|
print((3 << 1) == 6); // 0011 << 1 == 0110
print((3 >> 1) == 1); // 0011 >> 1 == 0001
print((3 | 4) == 7); // 0011 | 0100 == 0111
нить
Стоит отметить, что строки, представленные в Dart
插值表达式
Делает форматирование строк невероятно удобным.
// 1.Dart可以使用单引号或双引号来创建字符串
var s1 = "hello";
var s2 = 'world';
// 2.类似Python,Dart可以使用三引号来创建包含多行的字符串
var multiLine1 = """你可以像这样,创建一个
包含了多行的字符串内容
""";
var multiLine2 = '''你也可以使用三个单引号,创建一个
包含了多行的字符串内容
''';
// 3.类似Python,还可以在字符串字面值的前面加上`r`来创建原始字符串,则该字符串中特殊字符可以不用转义
var path = r'D:\workspace\code';
// 4.Dart支持使用"+"操作符拼接字符串
var greet = "hello" + " world";
// 5.Dart提供了插值表达式"${}",也可以用于拼接字符串
var name = "王五";
var aStr = "hello,${name}";
print(aStr); // hello,王五
// 当仅取变量值时,可以省略花括号
var aStr2 = "hello,$name"; // hello,王五
// 当拼接的是一个表达式时,则不能省略花括号
var str1 = "link";
var str2 = "click ${str1.toUpperCase()}";
print(str2); // click LINK
// 6. 与Java不同,Dart使用"=="来比较字符串的内容
print("hello" == "world");
логический тип
Использование логического типа в Dart такое же, как и в Java, только
false
,true
Два значения, нельзя использовать 0, отличное от 0 илиnull
,Нетnull
выражатьfalse
а такжеtrue
. В отличие от Java значение логического типа по умолчанию равноnull
bool flags;
print(flags); // null
список
Операции со списками в Dart аналогичны массивам в JavaScript.
// 创建列表
var list = [1, 2, 3];
// 下标从0开始。使用length可以访问list的长度
print(list[0]);
print(list.length);
// 可以使用add添加元素
list.add(5);
// 可在list字面量前添加const关键字,定义一个不可改变的 列表(编译时常量)
var constantList = const [1, 2, 3];
constantList[1] = 1; // 报错
карта
Также известен как ассоциативный массив, эквивалентный Java.HashMap
// 1.通过字面量创建Map
var gifts = {
'first' : 'partridge',
'second': 'turtledoves',
'fifth' : 'golden rings'
};
// 2.使用Map类的构造函数创建对象
var pic = new Map();
// 往Map中添加键值对
pic['first'] = 'partridge';
pic['second'] = 'turtledoves';
pic['fifth'] = 'golden rings';
// 3.获取Map的长度
print(pic.length);
// 4.查找Map
pirnt(pic["first"]);
print(pic["four"]); // 键不存在则返回 null
функция
В Dart функция (или метод) также является объектом, и ее тип
Function
. Это означает, что функции можно присваивать переменным и использовать в качестве аргументов для других функций.
определить функцию
Определяйте функции в Dart, в основном похожие на Java
String greet(String name){
return "hello,$name";
}
В Dart типы необязательны, а явный тип можно опустить, но все же рекомендуется указывать тип явно.
greet(name){
return "hello,$name";
}
Обратите внимание, что функции также являются объектами, и все функции имеют возвращаемые значения. Если возвращаемое значение не указано, функция возвращаетnull
. Конечно, если заставитьvoid
Чтобы изменить функцию, функция действительно не имеет возвращаемого значения, а это другое дело.
аргументы функции
Dart поддерживает два необязательных параметра
- Именованные необязательные параметры
- позиционный необязательный параметр
В Java перегрузка методов обычно используется для реализации различных вызовов параметров методов с одинаковыми именами, в Dart для достижения того же эффекта можно использовать необязательные параметры.
Именованные необязательные параметры
Давайте взглянем命名参数
, который использует фигурные скобки для определения списка параметров
// 定义一个函数,参数列表用花括号包裹
enableFlags({bool bold, bool hidden}) {
// do something
}
// 调用方式,传参时使用"参数名:值"的形式
enableFlags(hidden:true,bold:false);
Если значение по умолчанию установлено для параметра в списке параметров при определении функции, этот параметр является необязательным, и параметр можно игнорировать при вызове функции, и используется значение по умолчанию.
// 定义add函数
add({int x, int y=1, int z=0}){
print(x + y + z;
}
// 调用
add(x:18); // 19
add(x:18, y:2, z:10); // 30
Здесь следует отметить, что в версиях до SDK 1.21 нельзя использовать именованные параметры.=
число для установки значения по умолчанию, а после SDK 1.21 вы можете использовать только=
номер для установки значения по умолчанию. Поэтому, пожалуйста, проверьте и обновите версию SDK.
позиционный необязательный параметр
位置可选参数
Используйте скобки для определения списка параметров, параметры в скобках являются необязательными.
// 定义add函数
add(int x, [int y, int z]){
int result = x;
if (y != null){
result = result + y;
}
if (z != null){
result = result + z;
}
print(result);
}
// 调用
add(18); // 18
add(18,12); // 30
add(18, 12, 15); // 45
Дать位置可选参数
установить значение по умолчанию
// 定义add函数
add(int x, [int y=0, int z=0]){
print(x +y+z);
}
Последний, но тем не менее важный命名可选参数
а также位置可选参数
Отличие в том, что в первом параметры не имеют отношения к порядку, нет необходимости передавать параметры по порядку, и при передаче параметров необходимо использовать двоеточие; последний относится к порядку, а параметры должны передаваться по порядку.
анонимная функция
У большинства функций есть имена, но мы также можем создавать функции без имен, называемые анонимными функциями, также известные как лямбда-выражения или замыкания.
// 定义匿名函数,并将其赋值给一个变量func,注意,函数体最后的花括号处必须有分号结束。
var func = (x,y){
return x + y;
};
print(func(10,11)); // 21
Обратите внимание, что анонимные функции в основном такие же, как и обычные функции, у них также есть списки параметров и тела функций, но имя функции опущено.
стрелочная функция
Стрелочные функции в Dart в основном такие же, как в JavaScript. Когда тело функции содержит только один оператор, мы можем использовать
=>
Синтаксис стрелки для сокращения. Обратите внимание, что стрелочные функции — это просто синтаксический сахар для кратких выражений.
Обычная функция
add(num x, num y){
return x + y;
}
print(add(18,12)); // 30
стрелочная функция
// 与上面的普通函数完全等价
add(num x, num y) => x + y;
print(add(18,12)); // 30
Стрелочные функции опускают выражение фигурных скобок, за стрелкой следует выражение, а возвращаемое значение функции является значением этого выражения. Кроме того, стрелочные функции также можно комбинировать с анонимными функциями для формирования анонимных стрелочных функций.
var func = (num x, num y) => x + y;
оператор
Операторы в языке Dart в основном такие же, как в Java.
арифметические операторы
+
,-
,*
,/
,%
То же, что язык Java
В Dart есть еще один оператор целочисленного деления~/
, отличие от обычного знака деления в том, что результат деления округляется и возвращается.
Оператор решения типа
Ниже приведены операторы, зависящие от типа, добавленные Dart.
оператор | объяснять |
---|---|
as |
для преобразования типа |
is |
Возвращает True, если объект имеет указанный тип |
is! |
Возвратите True, если объект не имеет указанного типа |
когдаobj
ДостигнутоT
интерфейс, когдаobj is T
правда. Аналогично в Javainstanceof
.
Используется в дартсas
Оператор преобразует объект в определенный тип, если он не может быть преобразован, будет выброшено исключение, поэтому лучше использовать его перед преобразованием.is
Оператор для проверки.
// 将p转换为Person类型再操作
(p as Person).name = 'Bruce';
условное выражение
Dart также поддерживает троичные выражения.condition ? expr1 : expr2
Кроме того, Dart также добавляет непустой условный предикат??
expr1 ?? expr2
Вышеупомянутая операция означает, что если значение expr1 не равноnull
, возвращается его значение, в противном случае выполняется выражение expr2 и возвращается его результат.
var str1 = "Hello";
var str2 = "world";
var result = str1 ?? str2.toUpperCase();
каскадный оператор
мы обычно используем
.
Оператор вызывает метод объекта, который также поддерживается в Dart, но в Dart дополнительно добавляется каскадный оператор..
, представленный двумя точками.
级联运算符
Несколько методов могут быть вызваны последовательно, а переменные-члены могут быть доступны для одного и того же объекта. Используйте его, чтобы не создавать временные переменные и писать более плавный код.
Если класс Person имеет три метода,setName
,setAge
,save
, вы можете вызвать следующим образом
new Person()..setName("Bob")..setAge(20)..save();
использовать级联运算符
Вызывается метод, и другие методы объекта могут вызываться непрерывно и в потоке, при этом метод не возвращает сам объект.
условный метод доступа к члену
В Java легко столкнуться с раздражающими ошибками нулевого указателя, поэтому ненулевая оценка объекта должна быть выполнена до вызова метода.Такие операторы оценки делают код многословным, плохо читаемым и неопрятным. Dart изобрел новый оператор для обработки таких случаев.
условный метод доступа к члену?.
, это и.
Аналогично, но объект слева от оператора не может бытьnull
, иначе возвратnull
, если объект неnull
, возвращается сам объект.
// list1默认值为null
List list1;
print(list1?.length); // null
List list2 = [];
print(list2?.length); // 0
ветвь и петля
условная ветвь
Условное ветвление в Dart в основном такое же, как в Java.
if
условная ветвь
if(i < 0){
print('i < 0');
}else if(i == 0){
print('i = 0');
} else {
print('i > 0');
}
switch
условная ветвь
// 在switch的case中可以使用整数、字符串、枚举类型和编译时常量
String command = 'OPEN';
switch (command) {
case 'CLOSED':
break;
case 'OPEN':
break;
default:
print('Default');
}
оператор цикла
основной цикл
Основной оператор цикла в Dart такой же, как в Java.
// for循环
for(int i = 0; i < 9; i++) {
print(i);
}
// while循环
while(true){
//do something
}
// do-while循环
do{
//do something
} while(true);
уникальный цикл
var myList = ['Java','JavaScript','Dart'];
// for...in...循环,类似Java中的增强for
for (var it in myList ){
print(it);
}
// forEach循环。其参数为一个Function对象,这里传入一个匿名函数
myList.forEach((var it){
print(it);
});
// 可以使用匿名箭头函数简写
myList.forEach((it) => print(it));
Итерация по карте с использованием цикла
var myMap = {
'zhangsan':'201901',
'lisi':'201902',
'wangwu':'201902'
};
// forEach遍历Map
myMap.forEach((k, v) => print("$k : $v"));
// 根据键获取值来遍历。通过keys返回Map中所有键的集合
for(var k in myMap.keys){
print("$k : ${myMap[k]}");
}
СледующийDart Language — быстрый старт за 45 минут (часть 2)
GitHub
Dart Language — быстрый старт за 45 минут
видео уроки
Похожие видеокурсы, размещенные блогерами
Руководство по программированию Dart для полной разработки Flutter
Руководство по разработке полного стека Flutter
Обратите внимание на мой официальный аккаунт: Путь к программированию идет от 0 к 1