近来,flutter的热度在上升。flutter应用的主要开发语言是dart, 因此,欲练flutter, 必先了解dart.
dart是由google开发的编程语言,可用于开发移动应用,桌面应用,h5应用,后端服务。
本文将简单介绍flutter的语言特性、基础语法,以及在日常开发中非常实用的如何请求数据、如何处理异步、如何序列化与反序列化json等技能。
文章比较长,熟悉的部分各位看官可快速浏览,文末也给出了小小福利,供大家参考。疏漏之处请见谅,错误之处请指正。
语言特性 面向对象dart是一门纯粹的面向对象语言,在dart中一切皆对象。
函数也是对象,函数能被赋值给变量,也可以作为函数的参数或返回值
基础类型是对象,字面值也是对象,比如可以像下边这样使用
1.toString();支持接口、抽象类、泛型、多态
支持顶级函数和变量与java不同的是,java的变量和方法只能在类里边,而dart可以有不在类里的方法和变量。
带有面向过程类语言的特点,比如像c。
强类型弱类型均支持在dart中你可以显式的指定变量的类型,也可以不指定类型,由dart推断类型。指定类型的话编译器可以做静态类型检查。
在类型方面dart既有弱类型语言(像js)也有强类型(像java)的特点。
兼具解释性语言和编译型语言特点对开发web应用来讲:dart会被转译成js
对app、服务端、桌面应用讲:
dart提供了开发模式,通过vm解释执行,支持热更新,具有解释型语言特点
也提供了生产模式,通过编译成机器码执行,具有编译型语言特点
小结
dart看起来是希望融合多种主流语言的特性,在dart中能够看到多种语言的影子。
基础语法 程序入口dart的程序执行入口是main函数,这跟c很像,main函数一个顶级函数。
返回值通常是void, 写为int, double等也不会报错,不过没有意义。
void main() { print('Hello, World!'); } 变量和常量dart中的变量或常量必须先定义后使用
未被初始化的变量和常量默认值为null
变量var 变量名[=值];
void main() { var var1 = '1'; print(var1); // 1 // var1 = 1; 这样是错误的, 声明且初始化会推断出类型,后面不能赋值其他类型的值 var var2; print(var2); // null var2 = 2; print(var2); // 2 var2 = '3'; print(var2); // 3 正确,声明时不赋值则等同于声明了一个动态类型(dynamic)变量 }数据类型 变量名[=值];
这种方式可以显式声明变量类型,以便做一些静态检查。
void main() { // 声明并初始化 int var1 = 1; print(var1); // 1 // 先声明后初始化 int var2; var2 = 1; print(var2); // 1 // var2 = '1'; 这是错误的,类型不匹配 }dynamic 变量名[=值]
这个dynamic意思是动态类型,这种变量可以随便给他赋什么类型的值
void main() { dynamic var1 = 1; var1 = '2'; // 动态类型可以赋任意类型的值 print(var1); // 2 } 常量final [数据类型] 常量名=值
在运行时确定其值, 可以作为类的普通成员变量
const [数据类型] 常量名=值
必须在编译时确定其值,只能作为类的静态成员变量,不能作为普通成员变量
class User { final int var1=1; static const int var2=2; // const int var3 = 3; 错误,不能作为类的普通成员变量 } void main() { int var1 = 1; int var2 = 2; final int const1 = 1; const int const2 = 2; // const1 = 2; 错误,不能再改变 // const2 = 1; 错误,不能再改变 // final int const3; 错误,必须被初始化 // const int const4; 错误,必须被初始化 final int const5 = var1 + var2; // const int cont6 = var1+var2; 错误,必须在编译时可以确定值 } 数据类型num、int、double
int类型和double类型都是num类型
都是占8byte
是对象,有一些方法和属性
没有无符号类型
void main() { int int1 = 1; double double1 = 1.3; num num1 = 2.0; // 以下引发运行时异常 // int1 = num1; // print(int1); print(int1.toString()); // 1 print(int1.isEven); // false print(int1.floor()); // 1 print(int1.isNaN); // false print(double1.toString()); // 1.3 print(double1.floor()); // 1 print(double1.isNaN); // false }String
字面值表示法
单行字面值表示方法:'xx'或"xx"
多行字面值表示方法: '''xxx'''或"""xxx"""
忽略转译符: r'xx\nxx'
void main() { String str1 = 'str1'; print(str1); // str1 String str2 = "str2"; print(str2); // str2 String str3 = '''a b c '''; print(str3); // a // b // c String str4 = "a\nb"; String str5 = r"a\nb"; print(str4); // a // b print(str5); // a\nb }常用属性和方法