• 02-01dart语法


    1、论数字、函数和null都是对象

    在变量中可以放置的所有东西都是对象,而每个对象都是的实例。无论数字、函数和null都是对象。所有对象都继承自[Object]类。

    //    abstract class int extends num    
    int variable = 3 ;
     variable.toString()
     //  abstract class Function
        Function funcTest  = myFunc;
        myFunc.toString();
         null.toString();//null
         null.runtimeType ;//Null 
    
     void myFunc(int count){
    
     }
    

    2、dart类型安全

    (暂时不理会类型安全的定义,尤其是访问未被授权的内存)

    Dart的类型安全性意味着您不能使用if(非booleanvalue)或assert(非booleanvalue)之类的代码。相反,应该显式地检查值 if(tue)

    3、关键字

    abstract (1) do import (1) super
    as (1) dynamic (1) in switch
    assert else interface (1) sync* (2)
    async (2) enum is this
    async* (2) export (1) library (1) throw
    await (2) external (1) mixin (1) true
    break extends new try
    case factory (1) null typedef (1)
    catch false operator (1) var
    class final part (1) void
    const finally rethrow while
    continue for return with
    covariant (1) get (1) set (1) yield (2)
    default if static (1) yield*
    deferred (1) implements (1)

    4、变量

    • var name = 'Bob';
    • dynamic name = 'Bob'
    • Object va = 9;
    • String name = 'Bob';

    默认值

    未初始化的变量的初始值为null。甚至具有数字类型的变量最初也是null,因为数字——就像dart中的其他东西一样——是对象。

    int lineCount;
    

    5、Final 和 const修饰符

    Final 变量只能设置一次;(可以不再定义的时候设置值)

    const变量是一个编译时常数。(Const变量是隐式最终变量。)最终的顶级或类变量在第一次使用时被初始化。

    const关键字不只是声明常量变量。您还可以使用它来创建常量值,以及声明创建常量值的构造函数

    常量构造函数

    • 常量构造函数需以const关键字修饰
    • const构造函数必须用于成员变量都是final的类

    如下代码定义一个const对象,但是调用的构造方法不是const修饰的,则会报The constructor being called isn't a const constructor.错误

    另外注意这个普通的构造函数也有的错误

    final 修饰的变量必须在声明变量或者构造方法中初始化

    • 构建常量实例必须使用定义的常量构造函数

    如下代码,定义一个const对象,但是调用的却是非常量构造函数,会报The constructor being called isn't a const constructor.错误

    class People{
       final String name;
       final int age;
    //   const People({this.name,this.age});
    
        People({this.name,this.age});
    }
    


    • 常量构造函数中的 修饰位置 ( = 左右的区别)

      class People{
         final String name;
         final int age;
      //   const People({this.name,this.age});
      
          People({this.name,this.age});
      }
      
       People p =  People(name: "",age: 20);
      p.age = 30 ;  //final 修改不可修改
      
      class People{
       final String name;
       final int age;
       const People({this.name,this.age});
     }
     ///下面这两个的区别
     const  People p =  People(name: "",age: 20);
     People p1 = const People(name: "",age: 20);
    
      //p = People(name: "1",age: 21);//报错, p 是常量不可修改
       p1 = const People(name: "1",age: 21);
    
     ```c
    
    • const 修改变量

    作为成员变量必须使用static 编译时

    方法中临时变量,全局不用(这两个的意义在哪里呢?)

    6、函数

    参数

    • 普通参数
    • 可选命名参数
    • 可选位置参数
    • 默认参数值

    普通参数

    void  say(String from,String msg) {
     }
     say("from", "msg");
    

    可选命名参数

    void  say(String from,String msg, {String device,int age}) {
      }
     say("from", "msg",device: "ios",age: 10);
    

    可选位置参数

      void  say1(String from,String msg, [String device,int age]) {
    
      }
    say1("from", "msg","device");
    

    默认参数值(: = 似乎都可以)

    void enableFlags({bool bold = false, bool hidden:false}) {
      print("$hidden");
    }
    

    注意:

    • 可选参数(命名,位置)只能作为参数列表中的最后一项 
      
    • 可以使用 = 来定义命名和位置参数的默认值。默认值必须是编译时常量。如果没有提供默认值,则默认值为null。
      

    可选参数可以是位置参数,也可以是命名参数,但不能两者都包含。

    返回值

    所有函数都会返回一个值。 如果没有明确指定返回值, 函数体会被隐式的添加 return null; 语句。

    foo() {}
    
    assert(foo() == null);
    

    7、运算符

    • ~/ 代表 整除(返回值为int)

    • / 返回值 为double

    • 上面两个的 赋值运算符 分别是 ~/= 和 /=

    • ?? 代表 if null

       expr1 ?? expr2
      如果expr1是非空的,则返回其值;否则,计算并返回expr2的值。
      
    • ??=

      仅仅在b为空的情况下b被赋值value否则b的值不变
       var  b ??= value;
      
    • is 判断是某一个类型

    • is! 判断不是某一个类型

      int variable = 3 ;
      variable is int  // true
      variable is String// false
      variable is! int  false
      variable is! String// true
      
    • as

      • as操作符将对象转换为特定类型

        if (emp is Person) {
          // Type check
          emp.firstName = 'Bob';
        }
        

        使用as操作符可以使代码更简短:

        (emp as Person).firstName = 'Bob';
        

        注意:代码不等效。如果emp是null或不是Person,那么第一个示例(使用is)什么都不做;第二个(带有as)抛出异常。

      • 指定一个库前缀

      import 'package:rhflutterapp/utils/screen_util.dart' as KScreen;
       KScreen.ScreenUtil.sharedInstance()
      
    • .. 级联表示法

      注意:严格地说,级联的“..”表示法不是运算符。这只是Dart语法的一部分。

    class People{
       String name;
       void eat(){}
       int learn(){}
    }
    

    • . 和 ?.
      p?.name;
      p?.eat();
    

    判null 为null 后面的不执行 和swift一样

    如果p为null ,使用(?.)如果取值对象为空时返回null 但是使用(.)如果对象为空则抛出异常

  • 相关阅读:
    LUA之面向对象
    LUA笔记之表
    LUA笔记之字符串
    STM32模拟I2C
    php(1)-php5.6启动命令
    ip地址变更对tomcat和nginx的影响
    解决 nginx: [alert] kill(189, 1) failed (3: No such process)
    linux(16)-yum安装提示“没有可用软件包”
    性能测试监控分析(17) 负载和CPU使用率低高负载的原因
    Codeforces Round #588 (Div. 2)C(思维,暴力)
  • 原文地址:https://www.cnblogs.com/xiaowuqing/p/14027894.html
Copyright © 2020-2023  润新知