04.Flutter之Dart基础语法(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gzx110304/article/details/86598977

Flutter之Dart基础语法(一)

一.代码运行

  • ide使用androidstudio
  • 在Flutter项目的test目录下,新建并编写待执行的dart文件
  • 然后右键run就可以运行了。(注意:需要连接手机或者模拟器)

二.注释

  • 单行注释: 以’//'开头
  • 多行注释: 以’/‘开头,以’/'结尾
  • 文档注释: 以’///‘或者’/**'开头,可以通过dartdoc命令导出文档,导出的结果在我的工程根路径的/doc/api/文件夹里面

三.变量

  • 变量的声明,可以使用 var、Object 或 dynamic 关键字

    var name = '张三';
    
  • 如果一个对象没有明确的类型,则需要使用Object或者dynamic

  • 所有未初始化的变量的初始值为null

    int intDefaultValue;
    print(intDefaultValue);//打印结果为null,证明数字类型初始化值是null
    
    • 被final和const修饰的变量,其值只能被设置一次,并且变量类型可以省略不写,const变量是隐式的final,final不能与var同时使用
    //被final或者const修饰的变量,可以省略变量的类型声明
      final name1 = "张三";
    //  final String name1  = "张三";
    
      const name2 = "李四";
    //  const String name2 = "李四";
    
  • const关键字不只是声明常数变量。您也可以使用它来创建常量值,以及声明创建常量值的构造函数。 任何变量都可以有一个常量值

    // const []创建一个空的、不可变的集合。
    var varList = const []; 
    final finalList = const []; 
    const constList = const [];
    
    // 可以更改非final,非const变量的值
    // 即使它曾经具有const值
    varList = ["haha"];
    
    // 不能更改final变量或const变量的值
    // 这样写,编译器提示:a final variable, can only be set once
    // finalList = ["haha"];
    // 这样写,编译器提示:Constant variables can't be assigned a value
    // constList = ["haha"];
    
  • 只要任何插值表达式(使用$修饰)是一个计算结果为null或数字,字符串或布尔值的编译时常量,那么文字字符串就是编译时常量

    const aConstNum = 0;
    const aConstBool = true;
    const aConstString = 'a constant string';
    
    var aNum = 0;
    var aBool = true;
    var aString = 'a string';
    const aConstList = const [1, 2, 3];
    
    const validConstString = '$aConstNum $aConstBool $aConstString';
    //  这样用就会报错:Const variables must be initialized with a constant value
    //  const常量必须用conat类型的值初始化。
    //  const invalidConstString = '$aNum $aBool $aString $aConstList';
    

四.数据类型

  • int:整数值,其值不大于64位,这取决于平台。在DART VM上,值可以从 -2^63 到 2^62 。但是要编译成JavaScript,所以dart的数值允许值从 -2^53 到 2^53之间

  • double: 64位双精度浮点型

  • String: Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号或者双引号来创建字符串:

    String str1 = '单引号基本使用demo.';
    String str2 = "双引号基本使用demo.";
    

    单引号里面嵌套单引号,或者双引号里面嵌套双引号,必须在前面加反斜杠()

    // 单引号里面有单引号,必须在前面加反斜杠
    String str3 = '单引号里面有单引号it\'s,必须在前面加反斜杠.';
    //双引号里面嵌套单引号(正常使用)
    String str4 = "双引号里面有单引号it's.";
    //单引号里面嵌套双引号(正常使用)
    String str5 = '单引号里面有双引号,"hello world"';
    //双引号里面嵌套双引号,必须在前面加反斜杠
    String str6 = "双引号里面有双引号,\"hello world\"";
    print(str3);// 双引号里面有单引号it's,必须在前面加反斜杠
    print(str4);// 双引号里面有单引号it's.
    print(str5);// 单引号里面有双引号,"hello world"
    print(str6);//双引号里面有双引号,"hello world"
    

    单引号嵌套单引号或者双引号嵌套双引号不允许出现空串

    //这个会报错
    //String blankStr1 = 'hello''''world';
    //这两个运行正常
    String blankStr2 = 'hello'' ''world'; //结果: hello world
    String blankStr3 = 'hello''_''world'; //结果: hello_world
    // 这个会报错
    //String blankStr4 = "hello""""world";
    //这两个运行正常
    String blankStr5 = "hello"" ""world"; //结果: hello world
    String blankStr6 = "hello""_""world"; //结果: hello_world
    

    单引号里面有双引号,混合使用运行正常:

    String blankStr7 = 'hello""""world'; //结果: hello""""world
    String blankStr8 = 'hello"" ""world'; //结果: hello"" ""world
    String blankStr9 = 'hello""_""world'; //结果: hello""_""world
    

    双引号里面有单引号,混合使用运行正常:

    String blankStr10 = "hello''''world"; //结果: hello''''world
    String blankStr11 = "hello'' ''world"; //结果: hello'' ''world
    String blankStr12 = "hello''_''world"; //结果: hello''_''world
    

    字符串拼接的三种方式:

    1.直接把相邻字符串写在一起

    String connectionStr1 =  '字符串连接''甚至可以在''换行的时候进行。';
    print(connectionStr1);// 字符串连接甚至可以在换行的时候进行。
    

    2.用+把相邻字符串连接起来

    String connectionStr2 =  '字符串连接'+ '甚至可以在'+ '换行的时候进行。';
    print(connectionStr2);// 字符串连接甚至可以在换行的时候进行。
    

    3.使用单引号或双引号的三引号

    String connectionStr3 = ''' 
    这是用单引号创建的
    多行字符串。
    ''' ;
    print(connectionStr3);
    String connectionStr4 = """这是用双引号创建的
    多行字符串。""";
    print(connectionStr4);
    

    print(connectionStr3)输出结果如下:

    这是用单引号创建的
    多行字符串。
    

    print(connectionStr4)的输出结果如下:

    这是用双引号创建的
       多行字符串。
    

    在字符串前加字符r,或者在\前面再加一个\,可以避免“\”的转义作用,在正则表达式里特别有用

    print(r"换行符:\n"); //这个结果是 换行符:\n
    print("换行符:\\n"); //这个结果是 换行符:\n
    print("换行符:\n");  //这个结果是 换行符:
    

    使用$变量名,可以将变量名对应的变量值放入字符串中:

    var height = 48.0;
    print('当前标题的高度是$height'); //当前标题的高度是48.0
    

    使用${表达式},可以将表达式的值放入字符串中:

    print('1 + 1 = ${1+1}');//输出:1 + 1 = 2
    
  • 布尔类型:Dart表示布尔值的类型叫做bool,它有两个值,分别是:true和false, 当 Dart 需要一个布尔值的时候,只有 true 对象才被认为是 true。 所有其他的值都是 flase。这点和 JavaScript 不一样

  • list集合:Dart中的list和java中的数组类似:

    List list = [11, 95, 26];
    print(list);// 输出结果  [11, 95, 26]
    

    创建一个编译时常量const的list:

    List constantList = const[11, 95, 26];
    print(constantList);// 输出结果  [11, 95, 26]
    

    注意事项:

    1.可以直接打印list包括list的元素,list也是一个对象。但是java必须遍历才能打印list,java若直接打印list,结果是地址值。
    2.和java一样list里面的元素必须保持类型一致,不一致就会报错。
    3.和java一样list的角标从0开始。

    list集合常用api:

    1.list.add(1);把数字1添加到list中,默认是添加到末尾
    2.list.remove(1);一处数字1
    3.list.insert(0, 5);在索引为0的地方插入数字5
    int value = list.indexOf(10);查找10在list中的索引
    bool result = list.contains(5);查找list中是否包含数字5

  • map:Dart中的map是将键和值相关联的对象,类似一个js对象

    创建方式

    1.直接声明,用{}表示,里面写key和value,每组键值对中间用逗号隔开

    Map languages = {"first":"java", "second":"dart", "third":"python"};
    print(languages);//打印结果 {first: java, second: dart, third: python}
    

    2.先声明,再赋值

    Map languages1 = new Map();
    languages1['first'] = 'java';
    languages1['second'] = 'dart';
    languages1['third'] = 'python';
    print(languages1);//打印结果 {first: java, second: dart, third: python}
    

    3.要创建一个编译时常量const的map,请在map文字之前添加const

    final fruitConstantMap = const {2: 'apple',10: 'orange',18: 'banana'};
    print(fruitConstantMap);//打印结果 {2: apple, 10: orange, 18: banana}    
    

    添加元素。格式: 变量名[key] = value,其中key可以是不同类型

    languages['fourth'] = 'javascript';
    print(languages);//打印结果 {first: java, second: dart, third: python, fourth: javascript}
    

    修改元素。格式:变量名[key] = value

    languages['third'] = 'c++';
    print(languages);//打印结果 {first: java, second: dart, third: c++, fourth: javascript}
    

    查询元素

    1.查询map中的所有key和value

    //打印map中所有的key
    print(languages.keys);//打印结果 (first, second, third, fourth)
    //打印map中所有的value
    print(languages.values);//打印结果 (java, dart, c++, javascript)
    

    2.判断map中是否包含某个key和value

    //判断map中是否包含某个key
    print(languages.containsKey('first'));//打印结果 true
    //判断map中是否包含某个value
    print(languages.containsValue('java'));//打印结果 true
    

    删除元素.可以使用map的remove或者clear方法

    languages.remove('fourth');
    print(languages);//打印结果 {first: java, second: dart, third: c++}
    languages.clear();// 清空map集合的数据。
    print(languages);// 打印结果{}
    
  • runes 字符(用于在字符串中表示Unicode字符), Unicode代码点的常用方法是\uXXXX,其中XXXX是一个4位十六进制值,String类有几个属性可以用来提取符文信息。 codeUnitAt和codeUnit属性返回16位代码单元。可用于制作常用表情哦

    var clapping = '\u{1f44f}';
    print(clapping);
    print(clapping.codeUnits);
    print(clapping.runes.toList());
    
    Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
    //使用String. fromCharCodes显示字符图形
    print(new String.fromCharCodes(input));
    

五.运算符

  • Dart的运算符如下图所示:
    在这里插入图片描述

    1.’?.’, 类似java中的’.’, 比如:Test?.funs从表达式Test中选择属性funs(当Test为null时,Test?.funs的值为null)

    print(Test?.funs);//打印结果 5
    var a = null;
    print(a?.funcs);//打印结果 null
    
    class Test {
      static int funs = 5;
    
      Test() {
        print('构造函数 Test');
      }
      static fun() {
        print('Test fun函数');
      }
    }
    

    2.级联符号:’…’, 级联符号’…'允许您在同一个对象上进行一系列操作。 除了函数调用之外,还可以访问同一对象上的字段。其实相当于java的链式调用

    String s = (new StringBuffer()
    ..write('test1 ')
    ..write('test2 ')
    ..write('test3 ')
    ..write('test4 ')
    ..write('test5'))
      .toString();
    print(s); //打印结果 test1 test2 test3 test4 test5
    

    3.’??=’ 三目运算符的一种形式,例如:expr1 ??= expr2 表示如果expr1非空,则返回其值; 否则返回expr2的值

    //普通三元运算符
    int a1 = 10;
    var values = a1 > 5 ? a : 0;
    //??操作符
    print('a1 ??=3 : ${a1 ??= 3}');  //打印结果 a1 ??=3 : 10
    

    4.’~/’:除法,返回一个整数结果(向下取整), 而’/'返回的是一个浮点数

    var result1 = 15/7;
    print(result1); // 结果是:2.142857...
    var result2 = 15~/7;
    print(result2); // 结果是:2
    

    5.as、is与is!
    as:判断对象是否属于某种类型,如果属于,则返回该对象的实例
    is:如果对象具有指定的类型,则为true
    is!:如果对象具有指定的类型,则为false

    Test test = new Test();
    Test2 test2 = new Test2();
    print(test2 is Test);  // true
    print(test is! Test2);  // true
    
    (test2 as Test2).fun();  // Test2 fun函数
    // 相当于
    // if (test2 is Test) {
    //   test2.fun();
    // }
    
    class Test {
      static int funs = 5;
    
      Test() {
        print('构造函数 Test');
      }
      static fun() {
        print('Test fun函数');
      }
    }
    class Test2 extends Test {
      Test2() {
        print('构造函数 Test2');
      }
      void fun() {
        print('Test2 fun函数');
      }
    }
    

六.流程控制

  • if else

    if(condition1) {
        statement1
    } else if(condition2) {
        statement2
    } else {
        statement3
    }
    
  • for循环

    1.简单for循环

    for(int i=0; i<10; i++) {
        print(i);
    }
    

    2.使用forEach循环, 一般List和Set都可以使用forEach遍历元素, 如果要迭代的对象是Iterable,或者不想知道当前的迭代次数,可以使用forEach()方法

    var numbers = [1,2,3,4,5,6,7,8,9];
    numbers.forEach((number)=> print(number));
    

    3.使用for in循环,一般List和Set使用for-in遍历元素

    var list1 = [1,2,3];
    for(var data in list1){
        print(data);
    }
    
  • while 和 do while

    while(condition) {
        statement
    }
    
    do {
        statement
    } while(condition);
    
  • break 和 continue

    break:停止循环
    continue:终止本次循环,继续下一次循环

  • switch case: 与java用法一致

  • assert:如果布尔条件为false,则使用assert语句来中断正常执行。例如:

    // 确保值小于100
    var number = 10;
    assert(number < 100);
    

    要将消息附加到断言,请添加一个字符串作为第二个参数

    var urlString = 'http://www.baidu.com';
    assert(urlString.startsWith('https'),'URL ($urlString) should start with "https".');
    

    assert的第一个参数可以是任何解析为布尔值的表达式。如果表达式的值为true,则断言成功并继续执行。如果为false,则断言失败并抛出异常

七.异常

  • throw

    throw FormatException('Expected at least 1 section');
    

    因为抛出异常是一个表达式,所以可以在=>语句中以及允许表达式的任何其他地方抛出异常:

    void distanceTo(Point other) => throw UnimplementedError();
    
  • try catch: 捕获或捕获异常会阻止异常传递(除非您重新抛出异常)

    try {
        breedMoreLlamas();
    } on OutOfLlamasException {
        buyMoreLlamas();
    }
    

    要处理可能抛出多种类型异常的代码,可以指定多个catch子句。与抛出对象的类型匹配的第一个catch子句处理异常。如果catch子句未指定类型,则该子句可以处理任何类型的抛出对象

    try {
      breedMoreLlamas();
    } on OutOfLlamasException {
      // A specific exception
      buyMoreLlamas();
    } on Exception catch (e) {
      // Anything else that is an exception
      print('Unknown exception: $e');
    } catch (e) {
      // No specified type, handles all
      print('Something really unknown: $e');
    }
    

    您可以指定一个或两个参数catch()。第一个是抛出的异常,第二个是堆栈跟踪(StackTrace对象)

    try {
      // ···
    } on Exception catch (e) {
      print('Exception details:\n $e');
    } catch (e, s) {
      print('Exception details:\n $e');
      print('Stack trace:\n $s');
    }
    

    要部分处理异常,同时允许它传递,请使用rethrow关键字

    void misbehave() {
      try {
        dynamic foo = true;
        print(foo++); // 运行时异常
      } catch (e) {
        print('misbehave() partially handled ${e.runtimeType}.');
        rethrow; // 允许调用者查看exception.
      }
    }
    
    void main() {
      try {
        misbehave();
      } catch (e) {
        print('main() finished handling ${e.runtimeType}.');
      }
    }
    
  • finally: 无论是否抛出异常,要确保某些代码运行,请使用finally子句。如果没有catch子句匹配该异常,则在finally子句运行后传递异常

    try {
      breedMoreLlamas();
    } finally {
      // 即使抛出异常  也会执行这句代码.
      cleanLlamaStalls();
    }
    该finally子句在任何匹配的catch子句之后运行:
    try {
      breedMoreLlamas();
    } catch (e) {
        // 首先会处理异常
      print('Error: $e'); 
    } finally {
      // 然后执行这句语句
      cleanLlamaStalls(); 
    }
    

猜你喜欢

转载自blog.csdn.net/gzx110304/article/details/86598977