Flutter学习 (一) dart基本语法

2,543 阅读2分钟

1. 修饰符

  • var : 声明一个未初始化的变量( var data;),变量的类型可改变;申明一个初始化的变量( var data="123";),变量类型不可改变
  • dynamic : 编译时不会推断数据类型,但是运行时会推断,少用这个会造成字段赋值类型混乱, 即使信息错误 dart也检查不出问题
  • final: 申明必须初始化,被final或者const修饰的变量,变量类型可以省略,编译时不能确定值,初始化后不能改变 const 修饰的变量可以赋值个final
  • const: 申明必须初始化,final修饰的变量不可以赋值给const 编译时可以确定变量值
  • static : 类似java的static

2. 基本类型

基本类型生命之后都是null值 没有默认

1. Number 类型

  • int double num
  int i = 1; //整数值
  double d = 1.0; //double  64-bit (双精度) 浮点数
  double.maxFinite;  //最大值
  
  //int和double都是num的子类
  num n1 = 1;
  num n2 = 1.0;
  //转换
  //String->int
  int i2 = int.parse('1');
  double d2 = 1; //当double的值为int值时,int自动转成double
  //试着去分析 如果有误返回null
  int i2 = int.tryParse('1.0');//返回null
  //int->String
  String str = 123.toString(); //数字也是对象

2. String StringBuffer

  • String
  var name = '123';
  var names = '123 ${name}'; //拼接
  var rawNames = r'123 ${name}'; //加r前缀 打印出来的结果是 '123 ${name}'
  //三个单引号或者双引号 可以换行
  var multiLinesString = '''
  dongnao
  damon''';
  • StringBuffer
    
    //StringBuffer
    var sb = StringBuffer(); //dart 2 可以省略new
    //..级联符实现链式调用
    sb..write('aaa')..write('bbb')..write('ccc'); 
    sb.writeAll(['ddd', 'eee', 'fff'], ','); //第二个参数表示分隔符,将第一个参数列表里的数据用这个分隔符拼接起来
    
    
    
    

3.Booleans bool isNull;

4.List 集合

  • 创建方式
//自动长度
  List growableList = List();
  List growableList = new List()..length = 3;
 
  //固定长度
  var list = List(3); //List的声明,可以用var也可用List。

  //元素类型固定
  var typeList = List<int>();

  • 常用属性
  int first = typeList.first;  //第一个
  int last = typeList.last; //最后一个
  int length = typeList.length; //长度
  bool isEmpty = typeList.isEmpty; //是空
  bool isNotEmpty = typeList.isNotEmpty;// 不是空
  Iterable reversed = typeList.reversed; //反转
  • 增删改查
  var list4 = [];
  // 添加  插入
  list4.add(1);
  list4.addAll([2, 3, 4]);
  list4.insert(0, 0);
  list4.insertAll(1, [5, 6, 7]);
  //删
  list4.remove(5);
  list4.removeAt(2);
  //改
  list4[4] = 5;
  //range  从0开始 连续的三个数会被修改成9   批量修改
  list4.fillRange(0, 3, 9);
  //获取水印区间的值
  Iterable getRange = list4.getRange(0, 3);
  //查
  //是否包含
  var contains = list4.contains(5);
  //获取value的索引
  var indexOf = list4.indexOf(1);
  //条件去查找value的索引
  int indexWhere = list4.indexWhere((test) => test == 5);
  //排序
  list4.sort();
  //洗牌
  list4.shuffle();
  //复制子列表 截取列表中一段
  var list5 = list4.sublist(1);
  //操作符  集合相加
  var list6 = [8, 9];
  var list7 = list5 + list6;

5.set集合

    Set无重复列表
  var dynamicSet = Set();
 
  var set1 = {'123', 'asd'};

  var set2 = {'123', 'qwe', 'asd'};

 //set1 里独有的元素
  var difference12 = set1.difference(set2);
  //set2中独有的袁术
  var difference21 = set2.difference(set1);
 //交集
  var intersection = set1.intersection(set2);
 //并集
  var union = set1.union(set2);
 /只保留目标集合到当前setset2.retainAll(['123', 'asfd']); 
  • 循环
  //forEach
  collection.forEach((item) => print('forEach: $item'));
  //for-in遍历元素
  for (var item in collection) {
    print('for-in: $item');
  }

6. maps键值对

  • 申明方式
  var dynamicMap = Map();

  var map = Map<int, String>();
 
  var map1 = {'name': 'dongnao', 1: 'android'};
  
  map1.addAll({'name':'damon'});

  • 常用属性
  //常用属性
(map.isEmpty); //是否为空
(map.isNotEmpty); //是否不为空
(map.length); //键值对个数
(map.keys); //key 集合
(map.values); //value集合

7. Runes符号字符

  //Runes用于在字符串中表示Unicode字符 https://copychar.cc/emoji/
  String runesStr = '👄';
  Runes runes = new Runes('\u{1f605} \u6211');
  var str1 = String.fromCharCodes(runes); //使用String.fromCharCodes显示字符图形
  String str2 = '\u{1f605} \u6211'; //如果非4个数值,需要把编码值放到大括号中

8. Symbols标识符 ymbol标识符 主要是反射用,现在mirrors已经被移除了

3. 函数(方法)的书写方式

所有的函数都返回一个值。如果没有指定返回值,则 默认把语句 return null; 作为函数的最后一个语句执行。

main() {
  //普通函数定义
  int add(int x, int y) {
    return x + y;
  }

  testFunc() {}

  //可省略参数类型(不建议)
  add1(x, y) {
    return x + y;
  }

  //箭头函数:=>表达式
  int add2(int x, int y) => x + y;

  //可选命名参数:使用 {param1, param2, …} 的形式来指定命名参数
  int add3({int x, int y, int z}) {
    x ??= 1;
    y ??= 2;
    z ??= 3;
    return x + y + z;
  }

  //可选位置参数:把可选参数放到 [] 中,必填参数要放在可选参数前面
  int add4(int x, [int y, int z]) {
    y ??= 2;
    z ??= 3;
    return x + y + z;
  }

  //可选命名参数默认值(默认值必须是编译时常量),目前可以使用等号'='或冒号':'
  int add5(int x, {int y = 2, int z = 3}) {
    return x + y + z;
  }

  //可选位置参数默认值(默认值必须是编译时常量),只能使用等号'='
  int add6(int x, [int y = 2, int z = 3]) {
    return x + y + z;
  }


  //使用list或map作为默认值,但必须是const
  void func(
      {List list = const [1, 2, 3],
      Map map = const {1: 1, 'name': 'dongnao'}}) {
    //TODO ...
  }


  //无参匿名函数
  var anonFunc1 = () => print('无参匿名函数');
 
  //有参匿名函数
  var anonFunc = (name) => 'I am $name';

  //匿名函数传参
  List test(List list, String func(str)) {
    for (var i = 0; i < list.length; i++) {
      list[i] = func(list[i]);
    }
    return list;
  }
  var list = ['d', 'a', 'm', 'o', 'n'];
  test(list, (str) => str * 2)

  //List.forEach()就用的匿名函数
  List list1 = [11, 12, 13];
  list1.forEach((item) => print('$item'));

  //返回Function对象(闭包)
  Function makeAddFunc(int x) {
    x++;
    return (int y) => x + y;
  }

  var addFunc = makeAddFunc(2);
  print(addFunc(3));

  // 函数别名
  MyFunc myFunc;
  //可以指向任何同签名的函数
  myFunc = subtsract;
  myFunc(4, 2);
  myFunc = divide;
  myFunc(4, 2);
  //typedef 作为参数传递给函数
  calculator(4, 2, subtsract);
}

//函数别名
typedef MyFunc(int a, int b);
//根据MyFunc相同的函数签名定义两个函数
subtsract(int a, int b) {
  print('subtsract: ${a - b}');
}

divide(int a, int b) {
  print('divide: ${a / b}');
}
//typedef 也可以作为参数传递给函数
calculator(int a, int b, MyFunc func) {
  func(a, b);
}

4. 操作符

  • ?. 判空的

  • as、is、is! 强转 , 是这个类型返回true, 是这个类型返回false

  • A/B=D,A ~/ B = C D是带精度的数字 C是个整数 就是商

  • 三目运算符 A ? A : B 或者A ?? B

  • .. 级联操作符 返回使用的当前对象

5. 异常

  //抛出Exception对象
  throw new FormatException('格式异常');

  //抛出Error对象
  throw new NullThrownError();

  //抛出任意非null对象
  throw '这是一个异常';

  /// ---------------------------------异常的捕获try catch--------------------------------
  try {

   throw new OutOfMemoryError();
  } on OutOfMemoryError {
    //on 指定异常类型
 
    // rethrow; //把捕获的异常给 重新抛出
  } on Error {
    //捕获Error类型
   
  } on Exception catch (e) {
    //捕获Exception类型
 
  } catch (e, s) {
    //catch() 可以带有一个或者两个参数, 第一个参数为抛出的异常对象, 第二个为StackTrace对象堆栈信息
  }