Gm-aaa's blog.

dart基础

2025/04/09
loading

image

dart基础

数据类型

  • num

    • int

      int d=1
      int b=-1
    • double

      double a=3.14 //双精度浮点数
    num N=-3.0 //既可以是int,也可以是double
    //求绝对值
    n=N.abs();
    //数据类型转换
    n=N.toInt();//转换为整数
    n=N.toDouble();//转换为双精度浮点数
    n=N.toString();//转换为字符串
  • String

    //定义字符串的方式
    String str="123";
    String str='123';
    String str='123',stri="321"
    //定义复合的字符串
    String strin="str:$str"//这里的$str取到了变量str的值
    //常用方法
    String str="12345";
    str.substring(1,5)//裁切字符串范围:[1,5),字符串起始从0开始
    str.indexOf("23")//获取2的下标
    str.empty()//判断字符串是否为空
  • bool

    bool success=true;
  • List

    //集合的初始化方式 
    List list1=[1,2,3,"集合"]//默认泛型为Dynamic(动态数据类型)
    List<int> list2=[1,2,3,4]
    List list4=List.generate(3,(index) => index*2);//3=List总长度;index=下标;index*2=值为当前下标*2
    //list4=[0,2,4]

    //添加单个元素
    list2.add(100);
    //添加集合中的所有元素
    List<int> list3=[4,3,2,1]
    list3.addAll(list2);
    //遍历集合
    //方式1
    for(int i=0;i<list.length;i++){
    print(list[i]);
    }
    //方式2
    for(var o in list){
    print(o);//打印的是元素的值
    }
    //方式3
    list.forEach((x){
    print(x);
    });
    //移除元素
    list.remove(index);

  • Map

    //map的key是唯一的,如果key重复,那么后面添加的key会替换前面的

    //map初始化
    Map names={"姓名1":"小明","姓名2":"小红"};

    Map ages={};
    ages["年龄1"]=16
    ages["年龄2"]=18
    //map的遍历
    ages.forEach((key,value){
    print("key:$key,value:$value);
    });
    //通过遍历一个map生成另一个map
    Map ages2=ages.map((key,value){
    return MapEntry(key,value+1);
    });
    //遍历key
    for(key in ages.keys){
    print("key:$key value:${ages[key]}")//表达式需要使用${}获取
    }
    //显式通过泛型规定map的数据类型
    Map<String,int> ages3={};
  • dynamic

    • 是所有dart对象的基础类型,通常不会直接使用它;通过它定义的变量会关闭类型检查
  • var

    • 这是一个关键字,系统会自动推断类型的runtimeType
  • Object

    • 它是dart对象的基类,当Object o=xxx;​时,系统会认为o​是一个对象;与dynamic的最大区别在于类型检查

方法

  • 方法的构成与声明

    //返回值类型+方法名+参数
    int sum(int val1,int val2){
    var result=val1+val2;
    return result;
    }
    //也可以不显性的指明返回值类型
    sum(int val1,int val2){
    var result=val1+val2;
    return result;
    }
    //没有返回值
    sum(int val1,int val2){
    var result=val1+val2;
    print(result);
    }
    //参数类型可以省略
    //可选参数,这里的isTrue为可选参数,参数类型为bool,默认值为false
    void sum(val1,val2,{bool? isTrue=false}){
    if(isTrue ?? false){//这里的空安全检查代表当isTrue为空时,取false
    var result=val1+val2;
    print("result:$result")
    }
    }
  • 入口方法

    void sum(val1,val2,{bool? isTrue=false}){
    if(isTrue ?? false){//这里的空安全检查代表当isTrue为空时,取false
    var result=val1+val2;
    print("result:$result")
    }
    }
    //main方法为主入口方法
    void main(){
    sum(1,2,isTrue: true);
    }
  • 实例方法

    实例方法是一个普通函数,通过对象名.方法名​访问

    class FunctionLearn{

    void sum(val1,val2,{bool? isTrue=false}){
    if(isTrue ?? false){//这里的空安全检查代表当isTrue为空时,取false
    var result=val1+val2;
    print("result:$result")
    }
    }
    }

    //调用方法
    FunctionLearn f=FunctionLearn();//实例化对象
    f.sum(1,2,isTrue: true);

  • 私有方法

    通过在方法名前添加_​来标识该方法为私有方法,只有在类的内部能够调用,作用域为当前类

    class animal{
    void _eat(){
    print("吃饭");
    }
    }
  • 匿名方法

    List<String> list=["123","321"];
    list.forEach(/*(x){
    print(x);
    }*/);//这里被注释的部分即为匿名方法
    //当匿名方法的参数列表中的某个参数不需要使用时,可以使用_来忽略

  • 静态方法

    //使用static标识的方法,可以直接使用类名.方法名调用
    class Number{
    static int doSum(int v1,int v2){
    return v1+v2;
    }
    }
    //调用
    var n=Number.doSum(1,2);

面向对象

  • dart中,所有类的父类都是Object

  • 私有变量的作用域为当前文件

    class Person{
    String? name; //空安全,可以为空
    int? age;
    Person(this.name,this.age);
    }
    class Student extends Person{
    String? _school;
    String? city;
    String? country;
    String? fullname;
    //构造方法:
    //name,age交给父类进行初始化,{}代表可选参数,?代表可以为空
    Student(this._school,String? name, int? age,{this.city,this.country="China"})
    : funName="$country.$city",super(name,age){}//构造方法体可以省略
    }
  • 构造方法

    1.普通构造方法
    2.命名构造方法
    3.工厂命名构造方法
    4.工厂构造方法

    class Person{
    String? name; //空安全,可以为空
    int? age;
    Person(this.name,this.age);
    }

    class Student extends Person{
    String? _school;
    String? city;
    String? country;
    String? fullname;
    //构造方法:
    //name,age交给父类进行初始化,{}代表可选参数,?代表可以为空,
    //:代表初始化列表,在构造方法执行前初始化某些变量
    Student(this._school,String? name, int? age,{this.city,this.country="China"})
    : funName="$country.$city",super(name,age){}//构造方法体可以省略
    //命名构造方法可以为类实现多个构造方法,但是它没有返回值 [类名.方法名]
    Student.cover(Student stu):super(stu.name,stu.age){
    print("命名构造方法");
    }
    //命名工厂构造方法:factory [类名.方法名]
    //可以有返回值,而且不需要将类的final变量作为参数,是一种灵活获取类对象的方式
    //命名参数city:s.city,通常用于可选参数。
    //代表将s.city的值赋值给city这个变量,目的是可以让调用者明确指出哪些参数被传递了
    factory Student.create(Student s){
    return Student(s._school,s.name,s.age,city:s.city,country:s.country);
    }
    }
    class Logger{
    static Logger? _cache;
    factory Logger(){
    //避空赋值运算符 (??=),当_cache为null时,则将右边的表达式结果赋值给左边
    //当_cache不为null则无需操作,目的是保证_cache不为null
    //扩展:!在dart中有两个含义,在变量之前代表取反例如!_cache;
    //在变量之后代表断言该变量非空,例如_cache!

    _cache??=Logger()._create();
    return _cache!;
    }
    Logger._create();
    }

    void main(){
    //调用构造方法实例化对象
    Student st=Student("清华","xiaoMing",24);
    //调用命名构造方法
    Student s=Student.cover(st);
    }
  • getter和setter

    //get方法/set方法
    class Person(){
    String? _school;
    //get
    String? get school => _school;
    //set
    set school(String? value){
    this._school=value;
    }
    }
    //其他文件中访问
    void main(){
    //get
    Person p=Person();
    print(p.school);
    //set
    p.school="xxx";
    }
  • 抽象类和抽象方法

    //抽象类使用abstract关键字
    //抽象类中没有方法体的方法均为抽象方法
    //抽象类可以包含有方法体的方法
    //继承抽象类需要实现它的抽象方法
    //抽象类可以被其他类使用implements关键字实现
    //实现抽象类之后,必须重写抽象类的所有方法
    //抽象类无法被实例化,只能实例化其子类
    abstract class Study{
    void study();
    }
  • mixins

    mixins是一种特殊的类,无法被实例化但是可以被其他类使用
    mixins是在多个类层次结构中重用代码的一种方式(多继承的一种方式)
    要使用mixins,在with关键字后面跟一个或多个mixin的名字(用逗号隔开)。
    并且with要用在extends关键字之后
    mixins的特征:实现mixin,就创建一个继承Object类的子类(不能继承其他类),不声明任何构造方法,不调用super
    abstract class Study(){
    void study(){
    print("study");
    }
    }
    class Test extends Person with Study(){
    void s(){
    study();
    }
    }
  • dart泛型

    ///主要解决类、接口、方法的复用性
    //泛型类
    class Cache<T>{
    final Map<String,T> _cached={};
    void setItem(String key,T value){
    _cached[key]=value;
    }
    T? getItemByKey(String key){
    return _cached[key];
    }
    }
    //泛型可以约束参数类型
    class Member<T extends Person>{
    final T _person;
    Member(this._person);
    String fixedName(){
    return "fixed:${_person.name}";
    }
    }

CATALOG
  1. 1. dart基础
  2. 2. 数据类型
  3. 3. 方法
  4. 4. 面向对象