dart 基础语法

131 阅读4分钟

定义变量的方法

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}"; 

集合类型

  1. 列表List:[],
var names = ['abc','cde'];
  1. 集合Set:{}
var set1 = {'天空之城','依序塔尔'}
  1. 映射Map
var info = {
    'name':'jack',
    'age':18
}

函数

函数的参数:

  1. 必传参数
// name参数必须传入
viod say(String name){
    print(name);
}
  1. 可选参数,可选参数又可以分为位置可选,和命名可选参数。可选参数的默认值 位置可选参数:[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);
}

赋值运算符

  1. ??=

判断变量是否为null,如果是null则进行赋值,如果变量有值则不进行赋值操作。

var name = 'jack';
name ??= 'lilei'; 
  1. ??

判断前面的变量是否不为null,如果不为null则将变量的值赋给需要的变量。否则将后面的值赋给需要的变量。

var name = 'tom';
var who = name ?? 'jack'; // who = 'tom'
  1. 级联运算符 ..
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');
   }
}
  1. 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);
}
  1. 初始化列表
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);
  }
}
  1. 重定向构造函数
class Student {
  String name;
  int age;
  // 在Student构造函数后的初始化列表,调用命名构造函数,来重定向构造函数。
  Student(String name) : this._interial(name,18);
  
  Student._interial(this.name,this.age);
}
  1. 常量构造函数
// 在构造函数前添加const 关键字。这样构造函数中的变量。必须为final类型。
class Students {
  final String name;
  const Students(this.name);
}
  1. 工厂构造函数 可以手动返回一个对象,普通的构造函数会自动返回构造好的对象。主要的用途是创建相同的对象时返回同一个值。即缓存处理。
 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);
}
  1. setter 和 getter
class Person {
  String name='';
  
  // 需要先写个set标识, 然后后面跟个函数。
  set setName (String name ){
     this.name = name;
  }
  // String 是返回值类型,也即name的类型。
  String get getName{
    return name;
  }  
}
  1. 类的继承 extends

  2. 抽象类 abstract 抽象类可以定义抽象方法,即只需定义不需要实现。然后继承抽象类的类必须实现其抽象方法。抽象类不可以实例化。

abstract class Person {
    void runname();
}
  1. 隐式接口 默认情况下所有的类都是隐式接口, dart中只能单继承,即一个类只能继承一个类。不能多继承。 当将一个类当作一个接口使用时,那么实现这个接口的类,必须实现这个接口的所有方法。
class Flyer {
  void flying(){
  }
}

class Runner {
  void running(){
  }
}
// implements 关键字实现多个接口
class SuperMan implements Runner, Flyer{
  @override
  void flying(){
    
  }
  
  @override
  void running(){
    
  }
  
}
  1. 混入 mixin with 可以看到上面的隐式接口中,类必须实现这个接口的所有方法。混入则不需要
mixin Flyer {
  void flying(){
  }
}

mixin Runner {
  void running(){
  }
}

// 使用with关键字进行混入。不用想接口一样必须实现其方法。
class SuperMan with Runner, Flyer{
}
  1. 类属性和类方法

枚举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;