开发环境配置

1.安装dart sdk

中文地址:https://dart.cn/get-dart
windows如果是免安装包需要将sdk的bin目录添加到用户变量PATH中

2.vscode开发工具配置

安装Dart Cod和Code Runnere插件
在这里插入图片描述
新建一个目录并创建xxx.dart文件即可开始Hello World!

1.基础-变量-类型

void main(List<String> args) {
  // 注释
  ///注释
  /**注释 */
  // 用类型定义变量的话,在该变量被赋值之前使用会报错The non-nullable local variable 'abc' must be assigned before it can be used.
  
final只能赋值一次,const 声明即必须赋值
当const用在=右边,其作用是 修饰值,它意味着对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并且完全不可变。
当const用在=左边时,其作用是 声明变量,它要求 必须在声明变量时赋值,一旦赋值就不允许修改,而声明值一定要是编译时常数。
在flutter开发中能使用const尽量使用const声明为单例提升性能
常量构造函数总结如下几点:
 1. 常量构造函数需以const关键字修饰
 2. const构造函数必须用于成员变量都是final的类,并且必须有初始化值
 3. 构建常量实例必须使用定义的常量构造函数
 4. 如果实例化时不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例

  String str = '123';
  String str2 = '''
    123
    456
  ''';
  String re = '$str---$str2'+'999';
  print(re);

  int nu = 123;
  bool isFalse = str == nu;
  print(isFalse);

  List list1 = ['str', 123];
  List list2 = <int>[1, 2];
  list2.add(3);
  print(list2.length);//3

  List list3 = List.filled(2, 0); //List.filled创建的只能存储单一类型,此处等同于List<int>.filled(2, 0)
  // list3.add(3); //报错Cannot add to a fixed-length list
  print(list3);

  List list4 = List.filled(2, 0, growable: true);
  list4.add(3); //正常添加
  print(list4);

  var list5 = [1,2,3,4];
  list5.length = 3;
  print(list5);//[1, 2, 3]

  var map = {
    'key': 888
  };
  print(map['key']);

  var map2 = new Map();
  map2['key'] = 888;
  print(map2['key']);

  // 类型判断
  bool b1 = '123' is String;
  bool b2 = 123 is int;
  print(b1);
  print(b2);

/**
 * 暂不研究的类型
 *  Runes;
 *  Symbol;
 */
 
}

2.运算-类型转换-函数参数

void main(List<String> args) {
  /**
   * 运算符= + - * / % || && ++ --等和js一样,提供了??(空判断) ??= ~/(取商) ~/=
   * 三目 switch等也与js一样
   */
  var aa;
  aa ??= 1;
  print(aa); //1

  // 类型转换
  String str = '123';
  print(int.parse(str) == 123);
  String str1 = '123.00';
  print(double.parse(str1));

  String str2 = ''; //为空时parse报错
  double result = 0;
  // 解决1
  try {
    result = double.parse(str2);
  } catch (e) {}
  // 解决2
  if(str2.isNotEmpty) result = double.parse(str2);
  print(result); //0

  int nu = 123;
  print(nu.toString() == '123');

  print(''.isEmpty); //true
  var abc;
  print(abc == null); //true
  double ss = 1 / 0;
  print(ss.isInfinite); //true
  var ww = 0 / 0;
  print(ww.isNaN); //true

  // 方法可选参数
  String getNameStr(String name, [int? age, String? sex]) {
    return '$name-$age-$sex';
  }
  String nameStr = getNameStr('lucklin', 18);
  print(nameStr);//lucklin-18-null

  // 方法默认参数(默认参数属于可选参数)
  String getNameStr2(String name, [int? age, String sex = '未知']) {
    return '$name-$age-$sex';
  }
  String nameStr2 = getNameStr2('lucklin', 18);
  print(nameStr2);//lucklin-18-未知

  // 命名参数(无序)
  String getNameStr3(String name, {int? age, String sex = '未知'}) {
    return '$name-$age-$sex';
  }
  String nameStr3 = getNameStr3('lucklin', sex:'男', age:18);
  print(nameStr3);//lucklin-18-'男'

  //传递函数
  String test(Function fn) {
    return fn();
  }
  print(test(()=> 'this is args fn'));
}

3.list-set-map常用属性和方法

void main(List<String> args) {
  List list = ['1', '2', '3'];
  print(list.isEmpty);//false
  print(list.isNotEmpty);//true
  print(list.reversed);//(3, 2, 1)
  print(list.reversed.toList());//[3, 2, 1]

  List list2 = ['1', '2', '3'];
  list2.addAll(['4', '5']);
  print(list2);//[1, 2, 3, 4, 5]
  print(list2.indexOf('5'));//4
  print(list2.removeAt(4));//5
  list2.remove('1');
  print(list2);//[2, 3, 4]

  List list3 = ['1', '2', '3'];
  list3.insert(0, '0');
  print(list3);//[0, 1, 2, 3]
  list3.insertAll(0, ['-2', '-1']);
  print(list3);//[-2, -1, 0, 1, 2, 3]
  print(list3.join());//-2-10123
  // list2.fillRange(start, end, value);//包含开始不包含结束下标位置替换为value

  Set set = new Set();
  set.add('1');
  set.add('1');
  set.addAll(['1']);
  print(set);//{1}
  print(set.toList());//[1]
  print(['1', '1'].toSet());//{1}

  Map map = <String, String>{
    'name': 'lucklin',
    'age': '18'
  };
  print(map.keys.toList());//[name, age]
  print(map.values.toList());//[lucklin, 18]
  print(map.isEmpty);//false

  map.addAll(<String, String>{
    'sex': '男'
  });
  print(map);//{name: lucklin, age: 18, sex: 男}
  map.remove('sex');
  print(map);//{name: lucklin, age: 18}
  print(map.containsKey('age'));//true
  print(map.containsValue('18'));//true

  // 遍历相关方法(map/forEach通用)
  list3.forEach((e) => print(e));
  print(list3.map((e) => e*3));//(-2-2-2, -1-1-1, 000, 111, 222, 333)
  print(list3.where((e) => e == '0'));//(0) 等同js filter()
  print(list3.any((e) => e == '0'));//true 等同js some()
  print(list3.every((e) => e is String));//true 等同js every()
}

4.封装继承多态-泛型

class Animal<T> {
  T catgory;
  Animal(T this.catgory);
  void run() {
    print('$catgory---run...');
  }
}
class Dog<T> extends Animal<T> {
  Dog(T catgory) : super(catgory);
}

//abstract既可以作为抽象类也可以作为接口
abstract class A {
  late String catgory;
  void run();
  void publicFn();
}
//将A作为抽象类继承
class B extends A {
  @override
  void publicFn() {
    // TODO: implement publicFn
  }
  @override
  void run() {
    // TODO: implement run
  }
}

//将A作为接口实现(必须重写所有)
class C implements A {
  @override
  late String catgory;
  @override
  void publicFn() {
    // TODO: implement publicFn
  }
  @override
  void run() {
    // TODO: implement run
  }
}

//cdart中也是单继承多实现,但是供提了mixins来实现多继承(mxins类不能写构造方法)
class Cat {
}
class D with A, Cat {
  @override
  void publicFn() {
    // TODO: implement publicFn
  }
  @override
  void run() {
    // TODO: implement run
  }
}

void main(List<String> args) {
  Animal dog = new Dog<String>('狗');
  dog.run();//狗---run...
  print(dog is Dog);//true
  print(dog is Animal);//true
  print(dog is Object);//true
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐