Dart学习笔记(一):基础知识与内置类型

一、Dart基础知识;

  1. 新创建Flutter项目,Dart代码主要在 lib/main.dart文件中,由于本篇主要讲的是Dart的语法,故暂时不看main.dart文件,在lib目录下我们创建一个新的.dart文件grammar.dart,如图:

在这里插入图片描述
2. 程序入口
每个Dart程序都需要有一个==main()==方法,main()方法是Dart程序执行的入口,因此用Dart写的打印数字程序如下:

void main(){
  var number = 22;
  printInteget(number);
}

// 1. 打印一个数字
void printInteget(int number){
  print('print num $number');
}

说明

  • 内置的数据类型:int 、String、List、bool
  • 显示输出:print()
  • 用’'或者" " 表示一个字符串
  • $variableName 或者 ${expression} 表示字符串插值,包含一个变量或者表达式等效于字符串
  • var:声明变量而不指定类型
  • 当assert(condition) 的condition条件不为真时抛出一个异常
  1. 强制分号
    和JavaScript不同的是,Dart强制使用分号;

  2. 自动类型推断
    Dart是强类型语言,但是类型声明是可选的,支持自动推断,所以实例中,可以不写void

二、重要概念:

  1. 在变量中存放的所有东西都是变量,包括数字,函数和Null,Dart中所有能够使用变量引用的都是对象,每个对象都是一个类的实例,数字、方法、null都是对象,所有对象都继承自Object类
  2. . Dart支持通用类型,如List(整数列表)活List(任何类型的对象列表)
  3. Dart支持顶级函数(main()),以及绑定到类或对象(分别是静态方法(static)和实例(instance)方法)的函数,还可以在函数中创建函数
  4. Dart支持顶级变量。以及绑定到类或对象(静态和实例变量)的变量,实例变量有时也叫字段或属性
  5. Dart没有访问控制符(即public、protected、private),但是如果一个标识符以_开头,则表示它在 库内 是私有的
  6. 标识符可以以字母或_开头,后面可以跟其他字符或者数字(注意,Dart不支持$符,也不支持Unicode作为变量名)
  7. 有时候,某事物是一个表达(expression)还是一个语句(statement)很重要,所以用词要准确

三、Dart中的关键字

说明
(1)带有上标1的单词是内置标识符。避免使用内置标识符作为标识符。如果尝试为类或类型名使用内置标识符,则会发生编译时错误。
(2)使用上标2的单词是在Dart的1.0版本之后添加的与异步支持相关的更新的、有限的保留字。在以async, async*, 或者 sync* 标记的任何函数体中,不能使用async, await, 或者 yield作为标识符。
(3)关键字表中的所有其他词都是保留词。不能使用保留词作为标识符
在这里插入图片描述

四、Dart变量

  1. 声明变量
    可以使用如下语法[var|] variableId声明一个变量

  2. 默认值
    声明变量的时候,可以直接进行赋值操作,所赋予的这个值就是默认值。
    注意:
    未初始化的变量的初始值为null。甚至具有数字类型的变量最初也是null

五、Final 和 const修饰符

如果一个变量声明后不打算修改其值,那么可以把这个变量声明为final或者const,他们的区别在于:

  • final只能在初始化时赋值一次,后续值不可以修改
  • const同时也是final,区别在于const更加严格,它是编译时常量,也就是说如果一个变量声明为了const,那么应该是在非运行时就能得到这个值
nt getNum() {
    return 1;
}

void main() {
    final a = getNum(); // 没问题
    const b = getNum(); // 报错
}

六、内建类型

Numbers(数值)

Dart的数字有两种形式:
Dart支持两种类型的数值:int和double,它们都是num类的实例。num类型定义了基本的操作符,如+/-/*//,以及abs()、ceil()、floor()等函数,而int子类中还定义了位操作符(如>>)

1. int

  • 根据平台的不同,整数值不大于64位
  • 如果一个数字包含一个小数,它就是一个双精度数
double y = 1.1;

2. double

64位(双精度)浮点数

strings(字符串)

  • 可以使用单引号或双引号创建一个字符串
  var s1 = 'Single quotes work well for string literals.';
  var s2 = "Double quotes work just as well.";
  var s3 = 'It\'s easy to escape the string delimiter.';
  var s4 = "It's even easier to use the other delimiter.";
  print('$s1,$s2,$s3,$s4');
  • Dart同样支持模板字符串,语法为:${expression,如果expression是一个变量,那么可以省略{},即为$varibale。如果表达式的结果是一个对象,那么会调用对象的toString()方法

  • 可以使用+连接字符串

var s1 = 'Hello';
var s2 = 'World';
print(s1 + s2); // 输出:'HelloWorld'
  • 使用带有单引号或双引号的三重引号,创建多行字符串
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";
  • 用r前缀创建一个“原始”字符串:
var s = r'In a raw string, not even \n gets special treatment.';
// 有\n也不会换号
  • 字符串字面量是编译时常量。如果一个字符串带有插值,字符串插值内引用的表达式或者变量计算结果也是编译时常量,那么这个字符串就也是编译时常量,如:
const aConstNum = 0;
  const aConstBool = true;
  const aConstString = 'a constant string';

  var aNum = 0;
  var aBool = true;
  var aString = 'a string';
  const aConstList = const [1, 2, 3];

  // 以下字符串是合法的,因为它所引用的也都是编译时常量
  const validConstString = '$aConstNum $aConstBool $aConstString';
// 但是下面这个就是非法的,因为所引用的都不是编译时常量(四个变量全报红)
  const invalidConstString = '$aNum $aBool $aString $aConstList';

booleans(布尔值)

包括true和false,它们都是编译时常量
在Dart中,我们应该 显式地 判断一个变量,确保其计算结果是布尔型的

var name = 'Ruphi';
if (name) {
    print('Hello, $name');
}

lists (列表)

Dart中的数组称为List,其字面量语法示例如下

var list = [1, 2, 3];

如果在list字面量前加一个const关键字,那么可以定义为一个不变的list对象(也就是编译时常量),如

const constantList = const [1, 2, 3];
constantList[1] = 1; // 报错

maps

map是一个关联键和值的对象。键和值都可以是任何类型的对象。每个键只出现一次

 var fruits = {
    'apple': '苹果',
    'banana': '香蕉'
};

  var numMap = {
    1: '壹',
    2: '贰'
};

  print('$numMap');

注意:解析器推断gifts的类型为Map<String, String>,nobleGases的类型为Map<int, String>。如果您试图向map添加错误类型的值,则分析器或运行时将引发错误

  • 可以使用Map构造函数创建对象:
var fruits = new Map();
fruits['apple'] = '苹果';
fruits['banana'] = '香蕉';

const numMap = new Map();
numMap[1] = '壹';
numMap[2] = '贰';

注意:你可能觉得我们应该使用new Map()而不是使用Map()来创建一个对象。但是,在Dart2中new关键字是可选的

  • 在现有的map中添加一个新的键值对
var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair
  • 从map中查询,如果你要获取的键不再map中,将会返回一个null
var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
  • 使用.length获取map中元素的个数

runes (字符)

表示Unicode码点的常用方法是\uXXXX,其中XXXX是4位数的十六进制值。例如,心型字符(♥)的编码为\ u2665。要指定大于或小于4位十六进制数字,请将值放在花括号中。例如笑脸表情(😆)的编码\u{1f600}.

String类有几个属性可以用来获取runes信息。codeUnitAt和codeUnit属性返回16位代码单元。使用字符属性获取字符串的字符。

main() {
  var clapping = '\u{1f600}';
  print(clapping);
  print(clapping.codeUnits);
  print(clapping.runes.toList());

  Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
  print(new String.fromCharCodes(input));
}

运行效果如下
😀
[55357, 56832]
[128512]
♥ 😅 😎 👻 🖖 👍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值