Flutter之Dart基础语法(一)
一.代码运行
- ide使用androidstudio
- 在Flutter项目的test目录下,新建并编写待执行的dart文件
- 然后右键run就可以运行了。(注意:需要连接手机或者模拟器)
二.注释
- 单行注释: 以’//'开头
- 多行注释: 以’/‘开头,以’/'结尾
- 文档注释: 以’///‘或者’/**'开头,可以通过dartdoc命令导出文档,导出的结果在我的工程根路径的/doc/api/文件夹里面
三.变量
-
变量的声明,可以使用 var、Object 或 dynamic 关键字
var name = '张三';
-
如果一个对象没有明确的类型,则需要使用Object或者dynamic
-
所有未初始化的变量的初始值为null
int intDefaultValue;
print(intDefaultValue);//打印结果为null,证明数字类型初始化值是null
- 被final和const修饰的变量,其值只能被设置一次,并且变量类型可以省略不写,const变量是隐式的final,final不能与var同时使用
//被final或者const修饰的变量,可以省略变量的类型声明
final name1 = "张三";
// final String name1 = "张三";
const name2 = "李四";
// const String name2 = "李四";
-
const关键字不只是声明常数变量。您也可以使用它来创建常量值,以及声明创建常量值的构造函数。 任何变量都可以有一个常量值
// const []创建一个空的、不可变的集合。
var varList = const [];
final finalList = const [];
const constList = const [];
// 可以更改非final,非const变量的值
// 即使它曾经具有const值
varList = ["haha"];
// 不能更改final变量或const变量的值
// 这样写,编译器提示:a final variable, can only be set once
// finalList = ["haha"];
// 这样写,编译器提示:Constant variables can't be assigned a value
// constList = ["haha"];
-
只要任何插值表达式(使用$修饰)是一个计算结果为null或数字,字符串或布尔值的编译时常量,那么文字字符串就是编译时常量
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 variables must be initialized with a constant value
// const常量必须用conat类型的值初始化。
// const invalidConstString = '$aNum $aBool $aString $aConstList';
四.数据类型
-
int:整数值,其值不大于64位,这取决于平台。在DART VM上,值可以从 -2^63 到 2^62 。但是要编译成JavaScript,所以dart的数值允许值从 -2^53 到 2^53之间
-
double: 64位双精度浮点型
-
String: Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号或者双引号来创建字符串:
String str1 = '单引号基本使用demo.';
String str2 = "双引号基本使用demo.";
单引号里面嵌套单引号,或者双引号里面嵌套双引号,必须在前面加反斜杠()
// 单引号里面有单引号,必须在前面加反斜杠
String str3 = '单引号里面有单引号it\'s,必须在前面加反斜杠.';
//双引号里面嵌套单引号(正常使用)
String str4 = "双引号里面有单引号it's.";
//单引号里面嵌套双引号(正常使用)
String str5 = '单引号里面有双引号,"hello world"';
//双引号里面嵌套双引号,必须在前面加反斜杠
String str6 = "双引号里面有双引号,\"hello world\"";
print(str3);// 双引号里面有单引号it's,必须在前面加反斜杠
print(str4);// 双引号里面有单引号it's.
print(str5);// 单引号里面有双引号,"hello world"
print(str6);//双引号里面有双引号,"hello world"
单引号嵌套单引号或者双引号嵌套双引号不允许出现空串
//这个会报错
//String blankStr1 = 'hello''''world';
//这两个运行正常
String blankStr2 = 'hello'' ''world'; //结果: hello world
String blankStr3 = 'hello''_''world'; //结果: hello_world
// 这个会报错
//String blankStr4 = "hello""""world";
//这两个运行正常
String blankStr5 = "hello"" ""world"; //结果: hello world
String blankStr6 = "hello""_""world"; //结果: hello_world
单引号里面有双引号,混合使用运行正常:
String blankStr7 = 'hello""""world'; //结果: hello""""world
String blankStr8 = 'hello"" ""world'; //结果: hello"" ""world
String blankStr9 = 'hello""_""world'; //结果: hello""_""world
双引号里面有单引号,混合使用运行正常:
String blankStr10 = "hello''''world"; //结果: hello''''world
String blankStr11 = "hello'' ''world"; //结果: hello'' ''world
String blankStr12 = "hello''_''world"; //结果: hello''_''world
字符串拼接的三种方式:
1.直接把相邻字符串写在一起
String connectionStr1 = '字符串连接''甚至可以在''换行的时候进行。';
print(connectionStr1);// 字符串连接甚至可以在换行的时候进行。
2.用+把相邻字符串连接起来
String connectionStr2 = '字符串连接'+ '甚至可以在'+ '换行的时候进行。';
print(connectionStr2);// 字符串连接甚至可以在换行的时候进行。
3.使用单引号或双引号的三引号
String connectionStr3 = '''
这是用单引号创建的
多行字符串。
''' ;
print(connectionStr3);
String connectionStr4 = """这是用双引号创建的
多行字符串。""";
print(connectionStr4);
print(connectionStr3)输出结果如下:
这是用单引号创建的
多行字符串。
print(connectionStr4)的输出结果如下:
这是用双引号创建的
多行字符串。
在字符串前加字符r,或者在\前面再加一个\,可以避免“\”的转义作用,在正则表达式里特别有用
print(r"换行符:\n"); //这个结果是 换行符:\n
print("换行符:\\n"); //这个结果是 换行符:\n
print("换行符:\n"); //这个结果是 换行符:
使用$变量名,可以将变量名对应的变量值放入字符串中:
var height = 48.0;
print('当前标题的高度是$height'); //当前标题的高度是48.0
使用${表达式},可以将表达式的值放入字符串中:
print('1 + 1 = ${1+1}');//输出:1 + 1 = 2
-
布尔类型:Dart表示布尔值的类型叫做bool,它有两个值,分别是:true和false, 当 Dart 需要一个布尔值的时候,只有 true 对象才被认为是 true。 所有其他的值都是 flase。这点和 JavaScript 不一样
-
list集合:Dart中的list和java中的数组类似:
List list = [11, 95, 26];
print(list);// 输出结果 [11, 95, 26]
创建一个编译时常量const的list:
List constantList = const[11, 95, 26];
print(constantList);// 输出结果 [11, 95, 26]
注意事项:
1.可以直接打印list包括list的元素,list也是一个对象。但是java必须遍历才能打印list,java若直接打印list,结果是地址值。
2.和java一样list里面的元素必须保持类型一致,不一致就会报错。
3.和java一样list的角标从0开始。
list集合常用api:
1.list.add(1);把数字1添加到list中,默认是添加到末尾
2.list.remove(1);一处数字1
3.list.insert(0, 5);在索引为0的地方插入数字5
int value = list.indexOf(10);查找10在list中的索引
bool result = list.contains(5);查找list中是否包含数字5
-
map:Dart中的map是将键和值相关联的对象,类似一个js对象
创建方式
1.直接声明,用{}表示,里面写key和value,每组键值对中间用逗号隔开
Map languages = {"first":"java", "second":"dart", "third":"python"};
print(languages);//打印结果 {first: java, second: dart, third: python}
2.先声明,再赋值
Map languages1 = new Map();
languages1['first'] = 'java';
languages1['second'] = 'dart';
languages1['third'] = 'python';
print(languages1);//打印结果 {first: java, second: dart, third: python}
3.要创建一个编译时常量const的map,请在map文字之前添加const
final fruitConstantMap = const {2: 'apple',10: 'orange',18: 'banana'};
print(fruitConstantMap);//打印结果 {2: apple, 10: orange, 18: banana}
添加元素。格式: 变量名[key] = value,其中key可以是不同类型
languages['fourth'] = 'javascript';
print(languages);//打印结果 {first: java, second: dart, third: python, fourth: javascript}
修改元素。格式:变量名[key] = value
languages['third'] = 'c++';
print(languages);//打印结果 {first: java, second: dart, third: c++, fourth: javascript}
查询元素
1.查询map中的所有key和value
//打印map中所有的key
print(languages.keys);//打印结果 (first, second, third, fourth)
//打印map中所有的value
print(languages.values);//打印结果 (java, dart, c++, javascript)
2.判断map中是否包含某个key和value
//判断map中是否包含某个key
print(languages.containsKey('first'));//打印结果 true
//判断map中是否包含某个value
print(languages.containsValue('java'));//打印结果 true
删除元素.可以使用map的remove或者clear方法
languages.remove('fourth');
print(languages);//打印结果 {first: java, second: dart, third: c++}
languages.clear();// 清空map集合的数据。
print(languages);// 打印结果{}
-
runes 字符(用于在字符串中表示Unicode字符), Unicode代码点的常用方法是\uXXXX,其中XXXX是一个4位十六进制值,String类有几个属性可以用来提取符文信息。 codeUnitAt和codeUnit属性返回16位代码单元。可用于制作常用表情哦
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}');
//使用String. fromCharCodes显示字符图形
print(new String.fromCharCodes(input));
五.运算符
-
Dart的运算符如下图所示:
1.’?.’, 类似java中的’.’, 比如:Test?.funs从表达式Test中选择属性funs(当Test为null时,Test?.funs的值为null)
print(Test?.funs);//打印结果 5
var a = null;
print(a?.funcs);//打印结果 null
class Test {
static int funs = 5;
Test() {
print('构造函数 Test');
}
static fun() {
print('Test fun函数');
}
}
2.级联符号:’…’, 级联符号’…'允许您在同一个对象上进行一系列操作。 除了函数调用之外,还可以访问同一对象上的字段。其实相当于java的链式调用
String s = (new StringBuffer()
..write('test1 ')
..write('test2 ')
..write('test3 ')
..write('test4 ')
..write('test5'))
.toString();
print(s); //打印结果 test1 test2 test3 test4 test5
3.’??=’ 三目运算符的一种形式,例如:expr1 ??= expr2 表示如果expr1非空,则返回其值; 否则返回expr2的值
//普通三元运算符
int a1 = 10;
var values = a1 > 5 ? a : 0;
//??操作符
print('a1 ??=3 : ${a1 ??= 3}'); //打印结果 a1 ??=3 : 10
4.’~/’:除法,返回一个整数结果(向下取整), 而’/'返回的是一个浮点数
var result1 = 15/7;
print(result1); // 结果是:2.142857...
var result2 = 15~/7;
print(result2); // 结果是:2
5.as、is与is!
as:判断对象是否属于某种类型,如果属于,则返回该对象的实例
is:如果对象具有指定的类型,则为true
is!:如果对象具有指定的类型,则为false
Test test = new Test();
Test2 test2 = new Test2();
print(test2 is Test); // true
print(test is! Test2); // true
(test2 as Test2).fun(); // Test2 fun函数
// 相当于
// if (test2 is Test) {
// test2.fun();
// }
class Test {
static int funs = 5;
Test() {
print('构造函数 Test');
}
static fun() {
print('Test fun函数');
}
}
class Test2 extends Test {
Test2() {
print('构造函数 Test2');
}
void fun() {
print('Test2 fun函数');
}
}
六.流程控制
-
if else
if(condition1) {
statement1
} else if(condition2) {
statement2
} else {
statement3
}
-
for循环
1.简单for循环
for(int i=0; i<10; i++) {
print(i);
}
2.使用forEach循环, 一般List和Set都可以使用forEach遍历元素, 如果要迭代的对象是Iterable,或者不想知道当前的迭代次数,可以使用forEach()方法
var numbers = [1,2,3,4,5,6,7,8,9];
numbers.forEach((number)=> print(number));
3.使用for in循环,一般List和Set使用for-in遍历元素
var list1 = [1,2,3];
for(var data in list1){
print(data);
}
-
while 和 do while
while(condition) {
statement
}
do {
statement
} while(condition);
-
break 和 continue
break:停止循环
continue:终止本次循环,继续下一次循环
-
switch case: 与java用法一致
-
assert:如果布尔条件为false,则使用assert语句来中断正常执行。例如:
// 确保值小于100
var number = 10;
assert(number < 100);
要将消息附加到断言,请添加一个字符串作为第二个参数
var urlString = 'http://www.baidu.com';
assert(urlString.startsWith('https'),'URL ($urlString) should start with "https".');
assert的第一个参数可以是任何解析为布尔值的表达式。如果表达式的值为true,则断言成功并继续执行。如果为false,则断言失败并抛出异常
七.异常
-
throw
throw FormatException('Expected at least 1 section');
因为抛出异常是一个表达式,所以可以在=>语句中以及允许表达式的任何其他地方抛出异常:
void distanceTo(Point other) => throw UnimplementedError();
-
try catch: 捕获或捕获异常会阻止异常传递(除非您重新抛出异常)
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
要处理可能抛出多种类型异常的代码,可以指定多个catch子句。与抛出对象的类型匹配的第一个catch子句处理异常。如果catch子句未指定类型,则该子句可以处理任何类型的抛出对象
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e) {
// No specified type, handles all
print('Something really unknown: $e');
}
您可以指定一个或两个参数catch()。第一个是抛出的异常,第二个是堆栈跟踪(StackTrace对象)
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
要部分处理异常,同时允许它传递,请使用rethrow关键字
void misbehave() {
try {
dynamic foo = true;
print(foo++); // 运行时异常
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // 允许调用者查看exception.
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
-
finally: 无论是否抛出异常,要确保某些代码运行,请使用finally子句。如果没有catch子句匹配该异常,则在finally子句运行后传递异常
try {
breedMoreLlamas();
} finally {
// 即使抛出异常 也会执行这句代码.
cleanLlamaStalls();
}
该finally子句在任何匹配的catch子句之后运行:
try {
breedMoreLlamas();
} catch (e) {
// 首先会处理异常
print('Error: $e');
} finally {
// 然后执行这句语句
cleanLlamaStalls();
}
|
请发表评论