<>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 <http://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(); }
热门工具 换一换