定义变量的方法
var 声明变量
使用和js中var 差不多,dart中会进行类型推断,虽然使用var 没有明确指定变量类型,但是通过类型推断的方式,使得每个变量有着明确的类型。
var str = 'hello'; // str变量是字符串类
str = 123;// 会报错,dart中不能直接修改变量的类型
const 和final
const 和final 都是定义一个常量的方法,即赋值之后不能修改。 const必须在编译时就对其进行赋值,final则可以在运行时进行复制。如果把const 变量的值,赋值给另外一个参数
const num;
num =1; // 这时会产生报错
通过 identical() 函数检测它们是否是相同的对象,会返回true。
void main() {
final num2 = const Person();
final num3 = const Person();
print(identical(num2,num3)); // true
}
class Person{
const Person();
}
字符串类型
定义一个字符串时,可以使用单引号或者双引号,也可以使用3个双引号进行对字符串的换行。也可以使用${},来引入其它变量。
var str = 'qwe';
var str1 = "ttt";
var str2 = """
rrr
yyy
ooo
""";
var str3 = "nihao${str}";
集合类型
- 列表List:[],
var names = ['abc','cde'];
- 集合Set:{}
var set1 = {'天空之城','依序塔尔'}
- 映射Map
var info = {
'name':'jack',
'age':18
}
函数
函数的参数:
- 必传参数
// name参数必须传入
viod say(String name){
print(name);
}
- 可选参数,可选参数又可以分为位置可选,和命名可选参数。可选参数的默认值 位置可选参数:[int age, double height] 即必须按照可选参数的顺序进行传值。 命名可选参数:{int age}
//位置可选参数
void main() {
say1('jack'); //输出 jack 0 0
say1('tom',10, 1.25); // 输出 tom 10 1.25
}
void say1(String name,[int age=0, double height=0]){
print(name);
print(age);
print(height);
}
//命名可选参数
void main() {
say2('jack'); //输出 jack 0
say2('tom',age:10); // 输出 tom 10
}
void say2(String name,{int age = 0} ){
print(name);
print(age);
}
匿名函数
void main() {
// 这里test函数就传了一个匿名函数
test((int num1,int num2){
print(num1+num2);
return num1+num2;
});
}
// 定义一个类型
typedef Cfn = int Function(int num1,int num2);
void test(Cfn fun1){
fun1(20,30);
}
赋值运算符
- ??=
判断变量是否为null,如果是null则进行赋值,如果变量有值则不进行赋值操作。
var name = 'jack';
name ??= 'lilei';
- ??
判断前面的变量是否不为null,如果不为null则将变量的值赋给需要的变量。否则将后面的值赋给需要的变量。
var name = 'tom';
var who = name ?? 'jack'; // who = 'tom'
- 级联运算符 ..
void main() {
// 级联原酸
var p = Person()
..name = 'tom'
..eat()
..run();
//上面的级联运算符,就相当于 p.name = 'tom'; p.eat(); p.run();
}
class Person{
var name;
void eat(){
print('person eat');
}
void run(){
print('person run');
}
}
- for 循环
for(var i=0;i<10;i++){
print(i);
}
var name = ['why','what'];
for(var item in names){
print(item);
}
class 类
void main() {
var p = Person('tom');
var ph = Person.wihtheight('jack',1.88);
}
class Person{
var name;
double height;
Person(this.name);
// 命名构造函数
Person.wihtheight(this.name,this.height);
}
- 初始化列表
class People{
final String name;
final int age;
// : 来对age进行初始化操作。
People(this.name,{int age = 10}):this.age = age {
}
void getmsg(){
print(this.name);
print(this.age);
}
}
- 重定向构造函数
class Student {
String name;
int age;
// 在Student构造函数后的初始化列表,调用命名构造函数,来重定向构造函数。
Student(String name) : this._interial(name,18);
Student._interial(this.name,this.age);
}
- 常量构造函数
// 在构造函数前添加const 关键字。这样构造函数中的变量。必须为final类型。
class Students {
final String name;
const Students(this.name);
}
- 工厂构造函数 可以手动返回一个对象,普通的构造函数会自动返回构造好的对象。主要的用途是创建相同的对象时返回同一个值。即缓存处理。
class Person{
String name;
String color;
static final Map<String,Person> _namecache = <String,Person>{};
static final Map<String,Person> _colorcache={};
factory Person.withName(String name){
// putIfAbsent(key, addfunction) 查找当前key值是否存在map中,否则执行添加函数
return _namecache.putIfAbsent(name, () => Person._internal(name,'default'));
}
Person._internal(this.name,this.color);
}
- setter 和 getter
class Person {
String name='';
// 需要先写个set标识, 然后后面跟个函数。
set setName (String name ){
this.name = name;
}
// String 是返回值类型,也即name的类型。
String get getName{
return name;
}
}
-
类的继承 extends
-
抽象类 abstract 抽象类可以定义抽象方法,即只需定义不需要实现。然后继承抽象类的类必须实现其抽象方法。抽象类不可以实例化。
abstract class Person {
void runname();
}
- 隐式接口 默认情况下所有的类都是隐式接口, dart中只能单继承,即一个类只能继承一个类。不能多继承。 当将一个类当作一个接口使用时,那么实现这个接口的类,必须实现这个接口的所有方法。
class Flyer {
void flying(){
}
}
class Runner {
void running(){
}
}
// implements 关键字实现多个接口
class SuperMan implements Runner, Flyer{
@override
void flying(){
}
@override
void running(){
}
}
- 混入 mixin with 可以看到上面的隐式接口中,类必须实现这个接口的所有方法。混入则不需要
mixin Flyer {
void flying(){
}
}
mixin Runner {
void running(){
}
}
// 使用with关键字进行混入。不用想接口一样必须实现其方法。
class SuperMan with Runner, Flyer{
}
- 类属性和类方法
枚举enum
enum Colors {
red,
blue,
green
}
泛型
库的使用
文件导入 import '文件路径'; 可以使用as 关键字来对导入的库进行起别名。 可以使用 show:执行要导入的内容,hide:隐藏某个要导入的内容,导入其他的内容。 公共文件的抽取 export
import 'math.dart' as Math ;
Math.sum(); // math.dart 中的sum 方法
import 'math.dart' show sum;
import 'math.dart' hide sum;