一、文章概览

  • 主要内容:介绍Dart语言的基础知识,包括安装、变量定义、数据类型、集合操作、函数定义及使用等,旨在帮助读者快速掌握Dart语言,为学习Flutter打下基础。

二、Dart语言简介

  • 背景:Dart是由Google开发的一种编程语言,被选为Flutter框架的开发语言。尽管可能希望使用其他熟悉的语言(如JavaScript、Java等)开发Flutter,但目前只能使用Dart。
  • 学习建议:对于有编程基础的开发者,Dart的学习难度不大,主要关注其语法差异和特性即可。

三、Dart的安装与配置

  • 安装原因:虽然Flutter SDK内置了Dart,但单独安装Dart SDK可以方便单独学习和运行Dart代码。
  • 安装方式
    • 通过工具安装
      • Windows:使用Chocolatey。
      • macOS:使用Homebrew。
    • 直接下载SDK
  • VSCode配置
    • 推荐使用VSCode作为Dart的开发工具。
    • 需要安装Dart插件,便于编写和运行Dart代码。

四、Hello Dart

  • Hello World示例
    main(List<String> args) {
      print('Hello World');
    }
    
    • 入口函数main函数是Dart程序的入口,必须显式定义,且无返回值。
    • 参数传递:通过List<String>传递命令行参数。
    • 字符串定义:可以使用单引号或双引号。
    • 分号:每行语句以分号结尾。

五、定义变量

  • 明确声明
    String name = 'coderwhy';
    int age = 18;
    double height = 1.88;
    
    • 变量类型必须明确声明,且不能将其他类型赋值给已声明类型的变量。
  • 类型推导
    • var
      var name = 'coderwhy';
      
      • 类型由赋值推导,但不能改变类型。
    • dynamic
      dynamic name = 'coderwhy';
      name = 18; // 允许改变类型,但不推荐使用。
      
    • finalconst
      final name = 'coderwhy'; // 值不可修改
      const age = 18; // 值不可修改,且必须是编译时常量
      
      • final可以在运行时动态赋值,而const必须是编译时确定的值。

六、数据类型

  • 数字类型
    • 整数(int
      int age = 18;
      int hexAge = 0x12;
      
    • 浮点数(double
      double height = 1.88;
      
    • 字符串与数字转换
      var one = int.parse('111'); // 字符串转整数
      var two = double.parse('12.22'); // 字符串转浮点数
      var num1Str = 123.toString(); // 数字转字符串
      var num2StrD = 123.456.toStringAsFixed(2); // 保留两位小数
      
  • 布尔类型
    var isFlag = true;
    
    • Dart中布尔值只能是truefalse,不能像某些语言那样将非零值或非空值视为true
  • 字符串类型
    • 定义方式
      var s1 = 'Hello World';
      var s2 = "Hello Dart";
      var s3 = 'Hello\'Flutter'; // 使用转义字符
      var s4 = "Hello'Flutter";
      
    • 多行字符串
      var message1 = '''
      哈哈哈
      嘿嘿嘿
      嘻嘻嘻
      ''';
      
    • 字符串拼接
      var name = 'coderwhy';
      var age = 18;
      print('my name is ${name}, age is $age');
      
  • 集合类型
    • List
      var letters = ['a', 'b', 'c', 'd'];
      List<int> numbers = [1, 2, 3, 4];
      
    • Set
      var lettersSet = {'a', 'b', 'c', 'd'};
      Set<int> numbersSet = {1, 2, 3, 4};
      
      • Set是无序的,且元素不重复。
    • Map
      var infoMap1 = {'name': 'why', 'age': 18};
      Map<String, Object> infoMap2 = {'height': 1.88, 'address': '北京市'};
      
      • 操作
        print(infoMap1['name']); // 根据key获取value
        print(infoMap1.entries); // 获取所有entries
        print(infoMap1.keys); // 获取所有keys
        print(infoMap1.values); // 获取所有values
        infoMap1.remove('age'); // 根据key删除元素
        

七、函数

  • 基本定义
    int sum(num num1, num num2) {
      return num1 + num2;
    }
    
    • 函数类型为Function,可以作为变量、参数或返回值。
    • 箭头语法
      sum(num1, num2) => num1 + num2;
      
  • 参数类型
    • 命名可选参数
      printInfo1(String name, {int age, double height}) {
        print('name=$name age=$age height=$height');
      }
      
      • 调用时可以指定参数名:
        printInfo1('why', age: 18);
        
    • 位置可选参数
      printInfo2(String name, [int age, double height]) {
        print('name=$name age=$age height=$height');
      }
      
      • 调用时按顺序传递参数:
        printInfo2('why', 18, 1.88);
        
    • 参数默认值
      printInfo4(String name, {int age = 18, double height = 1.88}) {
        print('name=$name age=$age height=$height');
      }
      
  • 函数作为一等公民
    • 赋值给变量
      var bar = foo;
      bar('kobe');
      
    • 作为参数传递
      test(foo);
      
    • 作为返回值
      var func = getFunc();
      func('kobe');
      
  • 匿名函数
    movies.forEach((item) => print(item));
    
  • 词法作用域
    • Dart的作用域由代码结构({})决定,优先使用局部变量,否则向外查找。
  • 词法闭包
    var adder2 = makeAdder(2);
    print(adder2(10)); // 12
    
    • 闭包可以访问其词法范围内的变量。
  • 返回值
    • 所有函数都有返回值,未指定时默认返回null

八、总结

本文详细介绍了Dart语言的基础知识,包括安装、变量定义、数据类型、集合操作和函数使用等。通过这些内容,读者可以快速掌握Dart语言的核心特性,为后续学习Flutter打下坚实的基础。