Dart 初探 (一)

前言

Dart 是 Google 为 Flutter 开发的一款用于网页编程的语言,其类似于Javascript,也是一种面向对象的语言,但其采用基于类的编程,语法风格接近C语言。

虽说它是开发用于网页编程的,但它也可以开发命令行应用,甚至可以用于开发移动端应用,如 Flutter 就是一款基于 Dart 语言、用于移动端开发的跨平台开发套件。本篇文章的目的是先简单了解下 Dart 语言基础,为以后的 Flutter 开发做准备。

开始:创建一个 Dart 项目

使用VS Code,安装 Dart 扩展:

创建 Dart 项目:

  • Ctrl + Shift + P 打开命令面板,输入 dart

点击 Dart: New Project,选择第二项 Console Application

之后选择一个新项目所在路径,VS Code 就会自动创建一个示例项目。

点击 main() 方法上方的 Run 按钮,就可以运行项目代码:

可以看到,Dart 项目输出了结果。

基本语法:变量声明

变量 var 关键字

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
// var 变量, 可接受任何类型变量, // 一但赋值类型无法修改——强类型语言,具有类型的概念 var t = "hi world"; print(t); //t = 1000; 修改会导致编译失败 t = "hello world"; //可重新赋值 print(t);

根基类 Object 和 变量 dynamic 关键字

  • Object 是 Dart 所有对象的根基类,也就是说在 Dart 中所有类都是Object的子类(包括FunctionNull)

  • dynamic声明的对象编译器会提供所有可能的组合,因此编译时可能不会报错,但在运行时可能会产生报错——运行时错误

  • Object声明的对象只能使用 Object 的属性与方法,否则编译器会报错

    复制代码
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    // dynamic 变量 // 与var 不同, 赋值后类型可以修改 dynamic tt; tt = "cool guy"; print(tt); tt = "cool boy"; //可重新赋值 print(tt); tt = 10086; //也可赋值为其他类型 print(tt); //提供可能的内部方法的组合,编译时不会报错, //但对象的属性或方法不存在时运行时会报错 print(tt.length); // Object 类 // 所有 对象的根基类, 任何类型均可赋值给Object对象 Object o = "ohhhhh!"; print(o); o = 5201314; //可重新赋值,可赋值为其他类型值 print(o); //print(o.length); //只能使用Object对象的方法,否则编译器会报错

变量 finalconst 关键字

如果打算声明一个不改变的变量值,使用finalconst

  • const 变量是一个编译时常量(编译时直接替换为常量值)
  • final变量在第一次使用时被初始化
复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
// final 变量 final str = "This is a final str"; // 在第一次使用时被初始化 print(str); // str = "This is an another final str"; 重新赋值编译器会报错 // const 编译时常量 // 编译时被替换为常量值 const str2 = "This is a const str"; print(str2); //str2 = "This is an another const str"; 重新赋值编译器会报错

空安全

  • 不可空类型使用前必须初始化,可空类型使用前必须判空
  • 预期变量不能为空,但在定义时不能确定其初始值,则可以加上late关键字,表示会稍后初始化,但是在正式使用它之前必须得保证初始化过了,否则会报错
  • 可空类型的变量,在某些情况下即使我们给它赋值过了,但是预处理器仍然有可能识别不出,这时我们就要显式(通过在变量后面加一个”!“符号)指定其不为null
  • 可空类型的函数变量,使用?.call()进行调用,表示不为空时调用函数
复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
// 空安全 int a; //默认为不可空类型,必须在使用前初始化 //print(a * 7); // 在初始化前使用时, 编译器会报错 int? b; // 可空类型 if (b != null) { print(b * 7); // 可空类型在使用时, 必须先判空 } // late 关键字, 延迟初始化 late int k; k=9; // 使用! 显示指定不为null var s = k! * 9; // 函数变量使用?.call() 非空时调用 fun?.call()

进阶语法:函数

函数式编程

Dart 作为一种真正的面向对象的语言,即使函数也是对象,且属于一个类型Function,这说明函数可以赋值给变量或者作为参数传递给其他函数,这正是函数式编程的典型特征。

函数声明

  • 不显式声明返回值类型,会默认当作 dymastic 处理,没有类型推断
复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
int sum(int a, int b) { return a + b; } // 不声明返回值类型, 当作 dymastic 处理, 不是推断得到的类型 sum2(int a, int b) { return a + b; } // 单表达式函数 bool isTrue (bool result) => !result;

函数参数

  • 可选的位置参数:使用[] 可空类型参数进行包装, 需放置在参数列表的最后面

    复制代码
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    // 函数参数 String see(String from, String msg, [String? states]) { var result = '$from see $msg'; if (states != null) { result = '$result in $states'; } return result; } print(see('I', 'you')); // 不带可选参数调用 print(see('I', 'you', 'a football game')); // 带可选参数调用
  • 可选的命名参数:使用{}可空类型参数进行包装, 需放置在列表参数的最后面。Flutter中常用

    复制代码
    • 1
    • 2
    • 3
    • 4
    void setFlags({bool? isFromOuter, bool? isShow}) { // 处理逻辑... } setFlags(isFromOuter: false, isShow: true); // 带可选参数调用

    说明:不能同时使用可选的位置参数和可选的命名参数;可选参数列表需为可空类型,否则编译会报错

函数作为变量

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
// 函数作为变量 var say = (str) { print(str); }; say("hello");

函数作为类型参数

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
// 函数作为函数参数 void execute(var callback) { callback(); } execute(() => print("callback!"));
posted @   wx2020  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 易语言 —— 开山篇
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开