Flutter入门——必知必会之开发环境搭建和Dart基础语法总结(一)

引言

Dart 是谷歌在 2011 年推出的编程语言,是一种结构化 Web 编程语言,允许用户通过 Chromium 中所整合的虚拟机(Dart VM)直接运行 Dart 语言编写的程序,免去了单独编译的步骤。以后这些程序将从 Dart VM 更快的性能与较低的启动延迟中受益。Dart 从设计之初就为配合现代 web 整体运作而考虑,开发团队也同时在持续改进 Dart 向 JavaScript 转换的快速编译器。Dart VM 以及现代 JavaScript 引擎(V8 等)都是 Dart 语言的首选目标平台,也是将来转向Flutter的必学语言。

一、Flutter 开发环境配置

Flutter 开发环境配置十分简单,无论是Windows还是iOS平台,主要步骤都分为两步:

1、下载Flutter SDK

打开flutter官网,找到下载地址,考虑到国内的网络的原因,会有两类下载链接,一种是windows平台原始下载地址(可能需要翻墙),另一种是镜像地址点击即可,只要你的网速好。

2、配置系统环境变量PUB_HOSTED_URL和FLUTTER_STORAGE_BASE_URL

由于国内的特殊网络环境必须配置这两个指定的环境变量用于Flutter的升级维护。

PUB_HOSTED_URL=https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
或者交大的镜像地址
FLUTTER_STORAGE_BASE_URL= https://mirrors.sjtug.sjtu.edu.cn/
PUB_HOSTED_URL= https://dart-pub.mirrors.sjtug.sjtu.edu.cn/

3、将SDK解压到你想安装Flutter SDK的路径并配置path环境变量

你可以将SDK 解压到任何地方,但不要将Flutter安装到需要一些高权限的路径(如C:\Program Files\),
在这里插入图片描述
为了方便通过命令行执行这些Flutter工具指令你还可以把这些对应的路径配置到系统环境变量path下(非必需的),所有配置完毕之后,在Flutter安装目录的flutter文件下找到flutter_console.bat,双击运行并启动flutter命令行,接下来,你就可以在Flutter命令行运行flutter命令了,再运行 flutter doctor命令。

在Flutter命令行运行如下命令来查看是否还需要安装其它依赖,如果需要,会自动安装它们,该命令检查你的环境并在命令行窗口中显示报告,仔细检查命令行输出以获取可能需要安装的其他软件或进一步需要执行的任务。

4、安装开发Dart 和Flutter插件

不同的开发工具安装插件的流程有所不同,如果是用Android Studio来开发的,所以你只需要在找到Dart 和Flutter插件安装,安装成功之后你就会在Android Studio的菜单栏上看到新增了一个命令——New Flutter Project,接着就Enjoy your Flutter吧!

二、Dart语言概述

站在巨人肩上就看得更高,Dart语言在设计时既借鉴了Java和JavaScript等现有程序语言的部分特性(在静态语法方面和Java非常相似,如类型定义、函数声明、泛型等,而在动态特性方面又和JavaScript很像比如函数式特性、异步支持等。),也开发了自己独特的机制,在Dart中一切一切都是对象,每个变量都是一个对象,每个对象都是一个类的实例(对象的默认值为null),所有类型的初始化为null(没有初始化的变量自动获取默认值null),包括bool、num类型,因为所有的类型都是对象(所有对象都继承自Object类)。

三、Dart 语言基本语法

1、内置数据类型

Dart语言支持以下的数据类型,绝大部分和其他程序语言差不多。

1.1、 数字类型Numbers

Dart的数字类型的包括numint(范围-2的53次方到2的53次方)double(64位双精度浮点数),其中int、double都是num的子类型,由于Dart中每一个变量都是对应类的一个实例,所以可以直接调用所拥有的方法。

var x = 1;//int型
int y=1;
var hex = 0xDEADBEEF;//int 型
double d = 1.1;//double类型
var f= 1.42e5;
x.abs();
y.abs();
d.abs();

最后int 类型也支持传统按位移位(<<,>>),与(&)和或(|)运算符

1.2、 字符串类型

Dart字符串是UTF-16编码单元的序列,使用单或双引号来创建一个字符串

  • 直接使用一个单引号或一个双引号创建一个字符串
  • 可以使用 ${expression} 获取字符串值,expression为合法的表达式
  • 使用连接符“+” 或者 邻接字符串方式创建字符串
  • 使用 r 输出原始的字符串
String s1 = '字符串1';//s1 引用字符
var s2 = "字符串1";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = 'crazy' 'mo' ' blog';//Dart会自动把这三个子串合并到s4中
var usr="crazy";
var name="mo";
print('${usr+name}');//输出“crazymo”
var s5 = '''
You can create
multi-line strings like this one.
''';//使用三引号(单或双引号)创建一个多行字符串:
var s6 = r"""This is\t also a multi-line string.""";
print(s6);//输出原始的字符串,包含转义或其他特殊的字符串This is\t also a multi-line string.

1.3、布尔类型

 bool name = true;
  if (name) {
    print('You have a name!');
  }

1.4、列表类型List

Dart中列表类型List是用于保存一组相同类型且有序元素,可以直接打印List 包括List的元素,List的下标索引也是从0开始,泛型语法也和Java 差不多,有增删改查api且还支持倒序、排序、洗牌和使用 + 号运算符可把两个List合并

var list = [1, 2, 3];//静态初始化,长度还未确定
list.add(22);  
for(var k=0;k<list.length ;k++){
	print("${list[k]}\t");
}

List list2=List();//List list2=new List(); var list2=List();动态初始化,长度还未确定
list2.add("cmo");

for(var k=0;k<list2.length ;k++){
	print("${list2[k]}\t");
}

List list2=List(3);//初始化长度为3

1.5、 映射类型Map

一个 map 是一个对象,相关联的键和值,这两个键和值可以是任何类型的对象。

//静态初始化
  var gifts = {
  // 键            值
    'first' : 'partridge',
    'second': 'turtledoves',
    'fifth' : 'golden rings'
  };
  
  gifts['six']='dota2';//增加键值对,其中six 未存在与原来的map 映射中
  print(gifts['six'].toString());//根据键获取对应的值
  gifts['six']='dota3';//更新键对应的值
  print(gifts['six'].toString());//根据键获取对应的新值
  
  //动态创建
  var nobleGases = new Map();
  nobleGases[2] = 'helium';
  nobleGases[18] = 'argon';
  print(nobleGases[2].toString());//根据键获取对应的值

1.7、Set 集合类型

Dart 的Set 比Java 更强大,还提供了集合的常见数学运算求补集、交集、并集等。

  Set set=Set();
  set.addAll([1,2,3,4]);
  Set set2=Set();
  set2.addAll([3,4,5,6]);
  var diff=set.difference(set2);
  print(diff);//{1,2}
   var intersect=set.intersection(set2);
  print(intersect);//{3,4}
   var un=set.union(set2);
  print(un);//{1,2,3,4,5,6}

1.8、Runes

原始Unicode编码字符串,比如说输出emoji 表情

 Runes runes=Runes('\u{1f604} \u6211');
  var str=String.fromCharCodes(runes);
  print(str);

1.9、 符号类型

一个符号对象表示在Dart程序中声明的操作符或标识,以前老版本在反射中需要用到,现在dart:mirrors反射库已被移除,所以…

2、类型转换

// String -> int
var one = int.parse('1');
assert(one == 1);

// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');

// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');

3、常用检查

// 检查一个空字符串.
var fullName = '';
assert(fullName.isEmpty);

// 检查为零.
var hitPoints = 0;
assert(hitPoints <= 0);

// 检查是否为空.
var unicorn;
assert(unicorn == null);

// 检查NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);

4、变量定义

Dart定义变量的形式有三种:

4.1、使用内置类型进行声明

在变量声明中添加静态类型,即 内置类型 变量名形式,也可以不进行初始化赋值,后续再赋值。

4.2、使用var 进行声明

使用var 声明,即var 变量名形式,如果不进行初始化赋值的话,var 可以理解成是动态类型,可以代表任何类型,但是一进行初始化之后,对应的变量名则被编译器确定为一个类型就不能用其他不同类型赋值。

  var usr="blog.csdn.net/CrazyMo_";
  print(usr);
  usr="cmo";
  print(usr);
//  usr=666666;  编译错误

var 可接收任何类型,但是一经赋值,数据类型就被自动确定,就不能再改变其数据类型,因为在Dart中 使用var 声明之后,在编译时会自动根据第一次赋值的数据类型来推断类型,所以编译结束后数据类型就已经确定。

4.3、使用final和const 进行声明

如果从不打算改变一个变量,使用 final 或者 const 代替 var 或者其他类型。一个 final 变量只能被设置一次,而一个 const 变量是一个编译时常数。

 final id = 'Crzy'; // Or: final String name = 'Crzy';
  print(id);
  const money = 999999;//Or :const int money=999999;
  print(money);
 

const和final修饰的变量本身皆是永不可变的,但有有些区别。使用const初始化之后则只可读不可写,而且具有传递性,体现在如果修饰的是数据或其他容器类数据,则容器内的元素也不可改变;而final 不具有传递性,不会影响到容器内的元素的操作。

  
  const arr=[2,4,6];
  const arr2=[2,4,6];
  print(identical(arr,arr2));//返回true
  ///arr2[2]=88;
  
  final arr3=[2,4,6];
  final arr4=[2,4,6];
  print(identical(arr3,arr4));//返回false
  arr3[2]=99;
  print(arr3[2]);//返回false
  const w=10;
  const h=68;
  const square=w*h;

const和final小结:

  • 类级别的常量,使用static const 修饰
  • const 可使用其他const常量的值来进行初始化
  • 可以更改非final、非const 变量的值,即使曾经具有const值
  • const 导致的不可变性是可传递的
  • 相同的const 常量不会再内存中重复创建
  • const 需要是编译时的常量
  • 声明的类型可以省略,一经初始化后本身就不可改变,且不能与var同时使用

4.3、使用dynamic 声明变量

dynamic 大体上与var大同小异,区别在于var 一经初始化类型便被锁定,而使用dynamic 声明的变量即使进行了初始化赋值之后,也可以再次赋予不同的数据类型,从这个角度来说与Object 类型,但又与Object不同,Object 声明的变量会在编译时进行检查类型,而dynamic 则在编译期不进行检查,所以在编译的时候会通过。

dynamic d=6666;
d="cmo";
d.test();//编译通过虽然d中并没有test方法但运行的时候报错
Object obj=8888;
////obj.test(); 编译出错。

5、操作符

介绍 符号
一元后缀符 expr++expr–()[].?.
一元前缀符 -expr!expr~expr++expr–expr
乘法类型 * 、/%~/
加法类型 +-
位操作符 <<>>
按位与 &
按位异或 ^
按为或 I
比较和类型测试 >=<=><asisis!
等价 ==!=
逻辑与 &&
逻辑或 II
条件运算符 expr1 ? expr2 : expr3
级联运算符 . . 就是实现链式调用的效果
赋值 ==/=~/=%=+=-=<<=>>=&=*、 ^=I=
//?. 
String st;
print(st!=null ? st.length : null);//输出null
print(st ?.length);//输出null,如果st为null 则输出null 反之输出st.length

//~/ 除后取整,即返回商的指
print(3/2);//输出1.5
print(3~/2);//输出1

//as 类型转换
num n=2;  
int k=n as int;

//is、 is!   类型判断 
num n=2;
num m=6;
double dd=3.14;
print(m is int); //true
print(dd is int); //false 
int k=n as int;
print(k is! String); //true 
int j=90;
print(j is num);//true

// exp1 ?? exp2 如果exp1 不为null 则取exp1 的值,exp1为null则把exp2的值付给exp1
bool isPlay;
isPlay =isPlay ?? false;
print(isPlay);//false

//.. 级联运算符
List list2= List();
list2..add(99)..add(88);
print(list2);

6、控制流语句

Dart在控制流语句方面和Java 等前辈语言没多大区别,同样支持if 和 else
for 循环while 和 do-while循环break和continueswitch和 casetry 和 catch finalythrow 与 assert,只是for循环语句在原来的基础上增加了闭包支持。

//if 和 else
if(con1){      
}else if (con2){   
}else{    
} 
//while 和 do-while循环
while(!isDone()){
   doSomething();
}
do{

}while(!atEndOfPage());
//try catch
try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // 一个具体异常
  buyMoreLlamas();
} on Exception catch (e) {
  // 任意一个异常
  print('Unknown exception: $e');
} catch (e) {
  // 非具体类型
  print('Something really unknown: $e');
}

6.1、switch case

每一个不为空的case分句都以break语句结尾.其他正确的结尾方式也可以使用continue,throw或者return语句来实现。 当没有任何case分句的条件符合时,使用default分句来执行代码

var command = 'b';
switch (command){
 case 'a':
 	print("a");
 	break;
 case 'b':
    print("先打印b");
    continue startC;//继续在 startC标记的地方执行
 startC:   
 case 'c':
 	print("最后执行穿透");
 	break;

 default:
 	print("a2222");
    break;
}
//最终输出:先打印b    
//		  最后执行穿透

6.2、Dart的for循环中的闭包能获取循环变量的值

除了支持常规的索引迭代和forEach 方法之外,Dart的for循环中的闭包能获取循环变量的值

  var callbacks = [];
  for(var  i=0;i<2;i++){
    callbacks.add(() => print(i));
  }
  callbacks.forEach((c) =>c());

7、异常处理

异常也分为Exception和Erro 两大类,大体上与Java类似,但是具体语法有所增强。

 //throw new FormatException("格式化异常");
 //throw new NullThrownError("错误类型");
 //throw '任意非null类型'; 
  try{
  }on Error{
  //如果发生Error类型的异常则直接在这里捕获,不会进到catch语句
  }on Exception catch(e){
    print(e);
  }catch(e,s){
    
  }finally{
    
  }

7.1、Exception

在这里插入图片描述

7.2、Erro

在这里插入图片描述

未完待续…

猜你喜欢

转载自blog.csdn.net/CrazyMo_/article/details/88320931