Dart入门(一)

Dart

由Google主导开发,于2011年10月公开。它的开发团队由Google Chrome浏览器V8引擎团队的领导者拉尔斯·巴克主持,目标在于成为下一代结构化Web开发语言。

类似JavaScript,Dart也是一种面向对象语言,但是它采用基于类的编程。它只允许单一继承,语法风格接近C语言。


Dart安装

无论是什么操作系统,安装方式都是有两种:通过工具安装和直接下载SDK,配置环境变量 .
我是在https://dart.dev/tools/sdk/archive这个网站里下载适合自己电脑的版本,然后配置环境变量的,(在终端中输入dart --version,看到版本号表示成功安装)另外 编辑器是VSCode 安装的Dart插件,进行的文件编写
注意:文件扩展名 .dart,在终端运行文件是dart + 文件名即可(为了方便运行我在vsCode中加入插件Code Runner)


Dart入门

1.类似于C语言,入口是mian函数(函数无返回值)
2.在dart打印内容是 print()
入门:

创建helloDart.dart文件

main(List<String> args) {
print('Hello Dart');
}

打开终端,运行 dart helloDart.dart 看到打印出Hello Dart,表示运行成功


Dart语法

一、变量的声明

dart是强类型语言,变量有自己的类型

  1. 明确声明:类型 变量名称 = 赋值
    String name = 'hello Dart';
  2. 类型推导 (通过关键字var /const/final/dynamic)
    var name = 'hello Dart'
    const name2 = 'hello Dart'
    final name3 = 'hello Dart'
    注意:
    var 声明的类型是可改值的
    const不可重新赋值
    final 不可重新赋值
    区别:final可以运行时赋值 ;const必须直接赋值常量
  • 关键字dynamic 声明的变量类型可以更改
   dynamic bar = 'abc';
   bar = 124;
  • 输入代码后,发现居然没有报错。原因:通过类型推导,bar已经定义为String类型,但是由于前面关键字是dynamic,表示变量时动态的,可变的,所以之后bar可以重新赋值,改变这个变量的类型也不会报错的

二、数据类型

2.1. 数字类型
整数用 int,浮点数用 float

// 1.整数类型int  
int num = 123 ;  //10进制
num = 0x123; //16进制  
//2.浮点类型double  
double a  = 3.14

字符串和数字之间的转化:

// 字符串和数字转化
// 1.字符串转数字
var one = int.parse('111');
var two = double.parse('12.22');
print('${one} ${one.runtimeType}'); // 111 int
print('${two} ${two.runtimeType}'); // 12.22 double

// 2.数字转字符串
var num1 = 123;
var num2 = 123.456;
var num1Str = num1.toString();
var num2Str = num2.toString();
var num2StrD = num2.toStringAsFixed(2); // 保留两位小数
print('${num1Str} ${num1Str.runtimeType}'); // 123 String
print('${num2Str} ${num2Str.runtimeType}'); // 123.456 String
print('${num2StrD} ${num2StrD.runtimeType}'); // 123.46 String

2.2. 布尔类型
值为true和false

// 布尔类型
var isFlag = true;
print('$isFlag ${isFlag.runtimeType}');

注意: Dart中不能判断非0即真, 或者非空即真

  var msg = 'aa';
// 错误的写法
if (msg) {
  print(msg)
}
//正确的写法
if (msg != null) {
  print(msg)
}

2.3. 字符串类型

单、双、三引号包裹的

// 1.字符串定义方式
var msg = "aaa";
var msg2 = 'bbb';
var msg3 = '''
            a
            b
            c
''';

字符串和其他变量或表达式拼接: 使用${expression}, 如果表达式是一个标识符, 那么{}可以省略

// 2.字符串的拼接(${变量})
final name = "hello";
// 什么情况下可以省略{}
// 比如$直接跟一个变量
print("${name}");
print("$name");//可以省略

// 不能省略
// 比如{}是表达式
print("${name.runtimeType}");//String
print("$name.runtimeType");//hello.runtimeType

2.4.集合类型

定义方式

  1. List定义
  // 1.List类型 [元素1,元素2,...]
  List<String> letters=["a","b","c"];

2.Set定义

// 2.Set类型 {元素1,元素2,...}
// 开发中应用少,一般用在对List 去重
Set<int> nums= {1,2,3,1};
// print(nums);//{1,2,3} 发现重复的数字1只保留了一个

3.Map定义

  // 3.Map类型(key,value) {key1:value1,key2:value2,......}
  Map<String,dynamic> info= {
    "name":"lmm",
    "age":18
  }

集合常见操作

Lists里面常用的属性和方法:

常用属性:
length 长度
reversed 翻转
isEmpty 是否为空
isNotEmpty 是否不为空
常用方法:
add 增加
addAll 拼接数组
indexOf 查找 :传入具体值
remove 删除:传入具体值
removeAt 删除:传入索引值
fillRange(startIndex,endIndex,fillvalue) 修改
insert(index,value); 指定位置插入
insertAll(index,list) 指定位置插入List
toList() 其他类型转换成List
join() List转换成字符串
split() 字符串转化成List
forEach 遍历
map 来处理每一个集合中的对象,并返回一个结果
where 来过滤集合中的值,并返回一个集合
any 来判断集合中的值是否符合条件,并返回bool
every 来判断集合中的值是否符合条件,并返回bool

Maps里面常用的属性和方法:

常用属性:
keys 获取所有的key值
values 获取所有的value值
isEmpty 是否为空
isNotEmpty 是否不为空
常用方法:
remove(key) 删除指定key的数据
addAll({...}) 合并映射 给映射内增加属性
containsValue 查看映射内的值 返回true/false
forEach
map
where
any
every

三、函数

函数的类型是Function,也是对象

3.1.定义方式

返回值 函数的名称(参数列表) {  
  函数体
  return 返回值
}

所有函数都返回一个值。如果没有指定返回值,则语句返回null;隐式附加到函数体。

另外, 如果函数中只有一个表达式, 那么可以使用箭头语法(arrow syntax)

注意, 这里面只能是一个表达式, 不能是一个语句
sum(num1, num2) => num1 + num2;

3.2.函数的参数问题

函数的参数分成2种,必传参数和可选参数

// 可选参数分为两种:位置可选参数,命名可选参数

// 位置可选参数:[]
void Info2(String name,[int height]){
  print(name);
}
// 命名可选参数{}
void Info3(String name,{int height}){
  print("$name $height");
}

可以给可选参数添加默认值,但是必传参数不可以指定默认值

3.3.函数是一等公民

这就意味着你可以将函数赋值给一个变量, 也可以将函数作为另外一个函数的参数或者返回值来使用.

3.4.匿名函数的使用

main(List<String> args) {
  // 1.定义数组
  var letters = ['a', 'b', 'c', 'd'];

  // 2.使用forEach遍历: 有名字的函数
  printElement(item) {
    print(item);
  }
  letters.forEach(printElement);

  // 3.使用forEach遍历: 匿名函数
  letters.forEach((item) {
    print(item);
  });
  //这里也可以使用箭头函数
  letters.forEach((item) => print(item));
}

3.5.词法作用域

{}会决定作用域的范围

3.6.词法闭包

闭包可以访问其词法范围内的变量,即使函数在其他地方被使用,也可以正常的访问。

main(List<String> args) {
  makeAdder(num addBy) {
    return (num i) {
      return i + addBy;
    };
  }

  var adder2 = makeAdder(2);
  print(adder2(10)); // 12
  print(adder2(6)); // 8

  var adder5 = makeAdder(5);
  print(adder5(10)); // 15
  print(adder5(6)); // 11
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容