Flutter学习笔记02

学习笔记02

由于之前学的东西都没有记下来,而学习笔记又不易过长,所以分做几部分。

Dart语言基础

基本简介

在学一门编程语言之前,我会对这门语言最基础的“脾气”进行了解,像:是否完全面向对象,强弱类型语言之类的。以下就是对Dart语言的整理。部分借鉴自博客.

  • Dart跟Java一样,一切都是对象,一切对象都是class的实例,哪怕是数字类型、方法甚至null都是对象,所有的对象都是继承自Object

  • 虽然Dart是强类型语言,但是否声明变量类型是可选的因为Dart可以自动推断变量类型

  • Dart支持范型,List表示一个整型的数据列表,List则是一个对象的列表,其中可以装任意对象

  • Dart支持顶层方法(如main方法),也支持类方法或对象方法,同时,支持顶层变量,也支持类变量或对象变量,同时你也可以在方法内部创建方法

  • Dart中变量可以以字母或下划线开头,后面跟着任意组合的字符或数字

  • Dart 没有 public、private、protected 这些关键字,变量名以"_"开头意味着对它的 lib 是私有的。

  • 没有初始化的变量都会被赋予默认值 null。

  • final的值只能被设定一次。const 是一个编译时的常量,可以通过 const 来创建常量值,var c=const[];,这里 c 还是一个变量,只是被赋值了一个常量值,它还是可以赋其它值。实例变量可以是 final,但不能是 const。

  • 编程语言并不是孤立存在的,Dart也是这样,他由语言规范、虚拟机、类库和工具等组成:

    • SDK:SDK 包含 Dart VM、dart2js、Pub、库和工具。
    • Dartium:内嵌 Dart VM 的 Chromium ,可以在浏览器中直接执行 dart 代码。
    • Dart2js:将 Dart 代码编译为 JavaScript 的工具。
    • Dart Editor:基于 Eclipse 的全功能 IDE,并包含以上所有工具。支持代码补全、代码导航、快速修正、重构、调试等功能。
  • 不负责任的来说,如果说C# = C++ + VB + Java,那么Dart = Java + Python

准确的说,上面的东西我也都还没有完全搞明白。还是需要多多学习。

变量与常量

1.变量声明与初始化

  • 调用的变量name包含对String值为“张三” 的对象的引用,name推断变量的类型是String,但可以通过指定它来更改该类型,如果对象不限于单一类型(没有明确的类型),请使用Object或dynamic关键字。

      // 没有明确类型,编译的时候根据值明确类型
    	var name = ‘Bob’; 
      Object name = '张三';
      dynamic name = '李四';
      // 显示声明将被推断类型, 可以使用String显示声明字符串类型
      String name = 'Bob' ;
    

2.final and const

  • 一个 final 变量只能被初始化一次; const变量是一个编译时常量,(Const变量是隐式的final)

  • final的顶级或类变量在第一次使用时被初始化。

  • finalconst 修饰的变量无法再去修改其值。

  • flnal 或者 const 不能和 var 同时使用。

  • const关键字不只是声明常数变量,您也可以使用它来创建常量值,以及声明创建常量值的构造函数,任何变量都可以有一个常量值。

  • 简单的说一下,const是编译时常量,而final时运行时常量,finalconst要求更严格。

      // The final variable 'outSideFinalName' must be initialized.
      final String outSideFinalName
      
      // Members can't be declared to be both 'const' and 'var'
      const var String outSideName = 'Bill';
    
      // Members can't be declared to be both 'final' and 'var'
      final var String name = 'Lili';
      
      const speed = 100; //速度(km/h)
      const double distance = 2.5 * speed; // 距离 = 时间 * 速度
      
      final speed2 = 100; //速度(km/h)
      final double distance2 = 2.5 * speed2; // 距离 = 时间 * 速度
    

数据类型

1.num

  • num 是数字类型的父类,有两个子类 intdouble

  • int 根据平台的不同,整数值不大于64位。在Dart VM上,值可以从-263到263 - 1,编译成JavaScript的Dart使用JavaScript代码,允许值从-253到253 - 1。

  • double 64位(双精度)浮点数,如IEEE 754标准所规定。

     	int a = 1;
      print(a);
       
      double b = 1.12;
      print(b);
       
      // String -> int
      int one = int.parse('1');
      // 输出3
      print(one + 2);
       
      // String -> double
      var onePointOne = double.parse('1.1');
      // 输出3.1
      print(onePointOne + 2);
      
      // int -> String
      String oneAsString = 1.toString();
      // The argument type 'int' can't be assigned to the parameter type 'String'
      //print(oneAsString + 2);
      // 输出 1 + 2
      print('$oneAsString + 2');
      // 输出 1 2
      print('$oneAsString 2');
      
      // double -> String 注意括号中要有小数点位数,否则报错
      String piAsString = 3.14159.toStringAsFixed(2);
      // 截取两位小数, 输出3.14
      print(piAsString);
       
      String aString = 1.12618.toStringAsFixed(2);
      // 检查是否四舍五入,输出1.13,发现会做四舍五入
      print(aString);
    

2.String

  • Dart里面的String是一系列 UTF-16 代码单元。

  • 单引号或者双引号里面嵌套使用引号。

  • 用 或{} 来计算字符串中变量的值,需要注意的是如果是表达式需要${表达式}

       String singleString = 'abcdddd';
       String doubleString = "abcsdfafd";
       
       String sdString = '$singleString a "bcsd" ${singleString}';
       String dsString = "abc 'aaa' $sdString";
       print(sdString);
       print(dsString);
      
      
       String singleString = 'aaa';
       String doubleString = "bbb";
       // 单引号嵌套双引号
       String sdString = '$singleString a "bbb" ${doubleString}';
       // 输出 aaa a "bbb" bbb
       print(sdString);
       
       // 双引号嵌套单引号
       String dsString = "${singleString.toUpperCase()} abc 'aaa' $doubleString.toUpperCase()";
       // 输出 AAA abc 'aaa' bbb.toUpperCase(), 
       可以看出 ”$doubleString.toUpperCase()“ 没有加“{}“,导致输出结果是”bbb.toUpperCase()“
       print(dsString);
    

3.其余数据类型

在此不多做赘述,感觉跟Java大同小异。若之后,发现有不一样的地方,再行补充。

运算符

1.类型测试操作符

asisis!操作符是我之前没有碰到过的。

操作符 含义
as 类型转换
is 当对象是相应类型时返回 true
is! 当对象不是相应类型时返回 true

如果obj实现了T所定义的接口,那么obj is T将返回 true。比如,obj is Object必然返回 true

使用啊as操作符可以把一个对象转换为特定类型。一般来说,如果在is测试之后还有一些关于对象的表达式,可以把as当做是is测试的一种简写。下面举个例子:

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

也可以通过as来简化代码:

(emp as Person).firstName = '永动机';

注意:上面两段代码并不相等。如果emp的值为 null 或者不是一个 Person 对象,第一段代码不会做任何事情,第二段代码会报错 。

2.级联操作符

又是一个没有见过的操作符。
级联..允许对同一对象执行一系列操作。除了函数调用,还可以访问同一对象上的字段。这通常会省去创建临时变量的步骤,并允许编写更多的级联代码。下面举个例子:

querySelector('#confirm') // 获取一个对象
  ..text = 'Confirm' // 使用它的成员
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

第一个方法调用querySelector(),返回一个selector对象。遵循级联符号的代码对这个selector对象进行操作,忽略任何可能返回的后续值。

前面的例子相当于:

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

你也可以嵌套你的级联。例如:

final addressBook = (AddressBookBuilder()
  ..name = 'jenny'
  ..email = '[email protected]'
  ..phone = (PhoneNumberBuilder()
        ..number = '415-555-0100'
        ..label = 'home')
      .build())
.build();

在返回实际对象的函数上构造级联要小心。例如,以下代码失败:

var sb = StringBuffer();
sb.write('foo')
  ..write('bar'); // 错误:没有为“void”定义的方法“write”。

sb.write()调用返回void,你不能在void上构建级联。

注意:严格来说,级联的“双点”符号不是运算符。这只是Dart语法的一部分。

未完待续

发布了5 篇原创文章 · 获赞 0 · 访问量 61

猜你喜欢

转载自blog.csdn.net/weixin_43954609/article/details/103507377