Dart 语法 容易混淆的知识点记录

1.Dart中的变量与常量

1.1 变量

如果只是用var声明变量,声明该变量之后是可以修改数据类型的

var who;
who="what";
print(who is String);//true
who=10;
print(who is int);//true

如果声明的同时取赋值,那么该对象的类型就是固定的,不可修改

var who="what";
print(who is String);//true
who=10;//此处报错
print(who is int);//false

未赋值时,var声明的变量类型为dynamic(动态的)

Dart 语法 容易混淆的知识点记录_第1张图片

 

2.1常量

如果一个变量你以后不打算修改,可以使用 final 或者 const进行修饰,当你试图修改它的值,就会报错。

一个 final 变量只能赋值一次:它的值可以在运行时获取
一个 const 变量是编译时常量:代码还没有运行时我们就知道它声明变量的值
如下,同样是当前时间,final修饰的f对象是正确的,但const修饰的是错误的,原因是final可以在运行时对变量初始化,但const不行。

final f = DateTime.now(); // OK
const c = DateTime.now(); // ERROR Const variables must be initialized with a constant value.

2.函数

2.1 函数本身也是一个对象,可以作为参数传入。

double add(double a,double b,deal){
  return deal(a)+deal(b);
}

调用:
var fun = (double i) {
  return i * i;
};
print(add(3, 4, fun));//求两数的平方和

2.2 函数的简写

var fun = (double i) {
  return i * i;
};

可以简写为:
var fun = (i) {
  return i * i;
};

进一步可以简写为:
var fun = (i)=> i * i;

3.接口

实现接口的类拥有该接口的功能。比如num是实现了Comparable接口的,可以说明它有作比较的能力。
接口的实现的关键字是implements。

abstract class num implements Comparable {

Dart中的接口也是支持多实现的,用逗号隔开。比如String即实现Comparable,也实现了Pattern,
说明String同时可具有这两种功能。

abstract class String implements Comparable, Pattern {

定义一个操作接口:

abstract class Operable{
  void reflex();//反向
  void reflexX();//X反向
  void reflexY();//Y反向

  void scale(num xRate,num yRate);//缩放
  void translate(num dx,num dy);//平移
  void rotate(num deg,[isAnticlockwise=true]);//旋转
}

继承接口实现方法

class Vector2 implements Operable{
  num x;
  num y;
  Vector2(this.x,this.y);

  Vector2.fromMap(Map point){
    this.x = point['x'];
    this.y = point['y'];
  }

  @override
  void reflex() {
    this.x=-x;
    this.y=-y;
  }

  @override
  void reflexX() {
    this.x=-x;
  }

  @override
  void reflexY() {
    this.y=-y;
  }

  @override
  void rotate(num deg, [isAnticlockwise = true]) {
    var curRad = rad + deg*pi/180;
    this.x=distance*cos(curRad);
    this.y=distance*sin(curRad);
  }

  @override
  void scale(num xRate, num yRate) {
    this.x *=xRate;
    this.y *=yRate;
  }

  @override
  void translate(num dx, num dy) {
    this.x +=dx;
    this.y +=dy;
  }
  
  @override
  String toString() {
    return '(${this.x},${this.y})';
  }
}

4.库

4.1 类库中的命名冲突 as关键字

---->[utils/color_utils.dart]----
sin(double d){
}

---->[main.dart:5]----
import 'package:toly/utils/color_utils.dart';
import 'dart:math';
void main() {
  sin(5);
}

---->[解决方案]----
import 'package:toly/utils/color_utils.dart' as myMath;
import 'dart:math';

void main() {
  myMath.sin(5);
}

4.2 控制显示隐藏导入

import 'package:toly/utils/color_utils.dart' show sin;//只显示sin函数
import 'package:toly/utils/color_utils.dart' hide sin;//只隐藏sin函数

4.3 控制访问权限

Dart中没有private,public,protected修饰符,默认是可以被访问的。

Dart中规定,名称前加下划线可以限制外部的访问,如下_age。
方法名,文件名也是如此,不想对外暴露,前面加下划线即可

---->[painter/person.dart]----
class Person{
  String name;
  int _age;
  Person(this.name,this._age);

  say(){
    print("my name is $name and i am $_age years old.");
  }
}

---->[main.dart]----
void main() {
  var toly = Person("toly", 25);
  toly.say();//my name is toly and i am 25 years old.
  print(toly._age);//报错
}

5.多继承

5.1 mixin 

mixin是一个定义类的关键字。直译出来是混入,混合的意思
Dart为了支持多重继承,引入了mixin关键字,它最大的特殊处在于:
mixin定义的类不能有构造方法,这样可以避免继承多个类而产生的父类构造方法冲突

关于混入的方法重名,取后混入的方法

class Runner {
  go(){
    print("Runner-go");
  }
}

mixin Walker{
  go(){
    print("Walker-go");
  }
}

class Person with Runner,Walker{
  Person(){
    print("Person");
  }
}

main(){
  Person toly = Person();
  toly.go();//Walker-go
}

 

你可能感兴趣的:(flutter开发)