news 2026/6/11 9:02:53

【Dart 语言学习教程】 第一章:基础语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Dart 语言学习教程】 第一章:基础语法

本章是 Dart 学习的起点,涵盖变量、数据类型、运算符、控制流程、集合操作和函数等核心基础。每个知识点都配有完整的代码示例和解析,适合零基础入门。


1.1 Hello World 与环境搭建

知识点

  • Dart SDK 安装与环境配置
  • main()函数是程序的入口
  • 使用print()输出内容
  • 在线运行环境:DartPad(https://dartpad.dev)

代码示例

// 这是 Dart 的入口函数voidmain(){print('Hello, Dart!');// 控制台输出}

解析

  • void main()是必须的,程序从这里开始执行。
  • print()函数用于向控制台输出字符串。
  • 每行语句以分号;结尾。

运行方式

  • 本地:dart hello.dart
  • 在线:复制到 DartPad 点击 Run

1.2 变量与数据类型

知识点

Dart 是强类型语言,但支持类型推断。常用数据类型:

  • int:整数(64位)
  • double:浮点数(64位)
  • String:字符串(UTF-16)
  • bool:布尔值(true/false
  • List:列表(数组)
  • Map:键值对集合
  • Set:无序不重复集合

变量声明方式:

  • var:自动推断类型
  • dynamic:动态类型(可在运行时改变)
  • Object:所有类的基类,类型安全

代码示例

voidmain(){// 整数int age=25;// 浮点数double price=19.99;// 字符串Stringname='Alice';// 布尔bool isStudent=true;// 使用 var 推断类型varcity='Beijing';// 推断为 Stringvarscore=98.5;// 推断为 double// dynamic 可以改变类型dynamicvariable='Hello';print(variable);// Hellovariable=123;print(variable);// 123// List 列表List<int>numbers=[1,2,3];varfruits=['apple','banana'];// 推断为 List<String>// Map 映射Map<String,int>scores={'Math':90,'English':85};varperson={'name':'Bob','age':30};// 推断为 Map<String, Object>// Set 集合Set<String>colors={'red','green','blue'};}

解析

  • intdoublenum的子类型,支持算术运算。
  • 字符串可以用单引号或双引号包裹。
  • 列表(List)索引从 0 开始,支持add()remove()等方法。
  • 映射(Map)中的键必须是唯一的。

1.3 常量

知识点

  • final:运行时常量,只能赋值一次。
  • const:编译时常量,在编译时确定值。

代码示例

voidmain(){finalStringname='Alice';// name = 'Bob'; // 错误:final 变量不能再赋值constdouble pi=3.14159;// pi = 3.14; // 错误:const 变量不可修改// const 赋值必须使用编译时常量constint max=100;finalDateTimenow=DateTime.now();// final 可以接受运行时的值// const DateTime now2 = DateTime.now(); // 错误:DateTime.now() 不是编译时常量// 常量列表finalList<int>finalList=[1,2,3];finalList.add(4);// 可以修改内容,因为 final 只限制引用不可变// finalList = [4, 5, 6]; // 错误:不能重新赋值constList<int>constList=[1,2,3];// constList.add(4); // 错误:const 列表完全不可变}

解析

  • final适用于启动后不会再变化的变量(如用户ID)。
  • const适用于固定不变的值(如圆周率、最大重试次数)。
  • const还可以用在创建常量对象上,例如const Text('Hello'),Flutter 中可减少重建开销。

1.4 运算符

知识点

  • 算术运算符:+-*/%~/(整除)
  • 关系运算符:==!=><>=<=
  • 逻辑运算符:&&||!
  • 赋值运算符:=+=-=*=/=%=~/=
  • 空值相关:??(空值合并)?.(安全调用)??=(空值赋值)
  • 级联运算符:..?..允许连续调用对象的方法或属性

代码示例

voidmain(){// 算术int a=10,b=3;print(a+b);// 13print(a~/b);// 整除:3print(a%b);// 余数:1// 关系print(a>b);// true// 逻辑bool isAdult=true;bool hasTicket=false;print(isAdult&&hasTicket);// falseprint(isAdult||hasTicket);// true// 赋值复合int c=5;c+=2;// c = c + 2print(c);// 7// 空值合并String?name;StringdisplayName=name??'Guest';print(displayName);// Guest// 安全调用String?upper=name?.toUpperCase();print(upper);// null// 空值赋值String?nickname;nickname??='User';print(nickname);// User// 级联运算符varlist=[1,2];list..add(3)..add(4)..remove(2);print(list);// [1, 3, 4]}

解析

  • ~/是整数除法,结果向下取整。
  • ??:左侧为null时返回右侧的值。
  • ?.:调用前先判断是否null,若为null则整个表达式为null,不会执行方法。
  • ..允许对同一个对象进行多次操作,避免重复写变量名。

1.5 字符串操作

知识点

  • 字符串插值:${expression},简单的变量可省略大括号。
  • 多行字符串:三个单引号或双引号。
  • 原始字符串:前缀r,不转义。
  • 常用方法:lengthtoUpperCase()toLowerCase()trim()split()contains()replaceAll()等。

代码示例

voidmain(){Stringname='Dart';int version=3;// 字符串插值print('Hello,$name! Version$version');// Hello, Dart! Version 3print('Sum:${2+3}');// Sum: 5// 多行字符串Stringmultiline=''' This is line 1 This is line 2 ''';print(multiline);// 原始字符串(不转义)Stringraw=r'Newline: \n will not be escaped';print(raw);// 输出: Newline: \n will not be escaped// 字符串方法Stringgreeting=' Hello World! ';print(greeting.trim());// 'Hello World!'print(greeting.toUpperCase());// ' HELLO WORLD! 'print(greeting.contains('World'));// trueList<String>parts='apple,banana,orange'.split(',');print(parts);// [apple, banana, orange]print(greeting.replaceAll('World','Dart'));// ' Hello Dart! '}

解析

  • 插值中复杂表达式必须使用${}
  • 多行字符串保留换行符和缩进。
  • 原始字符串r'...'常用于正则表达式或文件路径。

1.6 控制流程

知识点

  • if / else条件分支
  • for循环(标准、for-in
  • while/do-while循环
  • switch / case(支持字符串、数值等,需要break
  • breakcontinue

代码示例

voidmain(){// if-elseint score=85;if(score>=90){print('优秀');}elseif(score>=60){print('及格');}else{print('不及格');}// for 循环for(int i=0;i<5;i++){print(i);}// for-in 遍历列表varfruits=['苹果','香蕉','橙子'];for(varfruitinfruits){print(fruit);}// whileint i=0;while(i<3){print(i);i++;}// do-while 至少执行一次int j=0;do{print(j);j++;}while(j<3);// switchStringgrade='B';switch(grade){case'A':print('优秀');break;case'B':print('良好');break;default:print('未知');}}

解析

  • switch必须包含breakcontinue以避免穿透。
  • for-in适合遍历集合,无需索引。
  • do-while常用于至少需要执行一次的场景(如输入验证)。

1.7 集合操作

知识点

  • List:有序可重复。常用方法:addremoveinsertindexOfsortforEachmapwherereducefold
  • Set:无序不可重复。常用方法:addremovecontainsunionintersection
  • Map:键值对。常用方法:keysvaluescontainsKeyforEachmap
  • 集合推导式:结合iffor生成集合。

代码示例

voidmain(){// List 操作List<int>numbers=[1,2,3];numbers.add(4);numbers.remove(2);print(numbers);// [1, 3, 4]numbers.sort();numbers.forEach((n)=>print(n));// 高阶函数vardoubled=numbers.map((n)=>n*2).toList();print(doubled);// [2, 6, 8]varevens=numbers.where((n)=>n%2==0).toList();print(evens);// [4]// reduce 求和int sum=numbers.reduce((a,b)=>a+b);print(sum);// 8// fold 带初始值int product=numbers.fold(1,(a,b)=>a*b);print(product);// 12// Set 操作Set<int>setA={1,2,3};Set<int>setB={3,4,5};print(setA.union(setB));// {1,2,3,4,5}print(setA.intersection(setB));// {3}// Map 操作Map<String,int>scores={'Math':90,'English':85};scores['Science']=95;scores.forEach((subject,score)=>print('$subject:$score'));print(scores.keys);// (Math, English, Science)}

解析

  • mapwhere返回的是惰性集合,需要.toList()转成 List。
  • reduce要求集合非空;fold可提供初始值,为空时返回初始值。
  • Set 的unionintersection返回新 Set。

1.8 函数

知识点

  • 函数定义:返回值类型、函数名、参数列表、函数体。
  • 可选参数:位置可选参数[])、命名可选参数{})。
  • 默认参数值:在可选参数中指定。
  • 匿名函数(Lambda)。
  • 箭头函数:=>仅适用于单表达式函数体。

代码示例

voidmain(){// 普通函数print(add(3,5));// 8// 位置可选参数print(greet('Alice','Mr'));// Hello Mr Aliceprint(greet('Bob'));// Hello Bob// 命名可选参数print(createUser('Alice',age:25,country:'USA'));print(createUser('Bob',age:30));// country 使用默认值// 匿名函数(作为参数)List<int>list=[1,2,3];list.forEach((item)=>print(item));// 或使用箭头函数list.forEach(print);// 函数作为变量Functionmultiply=(int a,int b)=>a*b;print(multiply(4,5));// 20}// 普通函数intadd(int a,int b){returna+b;}// 位置可选参数:中括号内为可选,可设默认值Stringgreet(Stringname,[Stringtitle='']){if(title.isEmpty)return'Hello$name';return'Hello$title$name';}// 命名可选参数:大括号内,调用时需指定参数名StringcreateUser(Stringname,{int age=18,Stringcountry='China'}){return'name:$name, age:$age, country:$country';}

解析

  • 位置可选参数按顺序传递,可以设置默认值。
  • 命名可选参数调用时使用paramName: value,顺序无关,更推荐用于参数较多的函数。
  • 匿名函数常用作回调,如list.forEach((item) { ... })
  • 箭头函数=>只能包含一个表达式,不能有花括号和分号。

总结

第一章涵盖了 Dart 基础语法的 8 个核心部分,每个知识点都提供了可直接运行的代码示例和详细解析。掌握这些内容后,你已经能够编写简单的 Dart 程序,为学习 Flutter 打下坚实基础。下一章将进入面向对象编程(类、继承、混入等)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 9:02:03

终极指南:在Windows上制作macOS官方安装盘的完整教程

终极指南&#xff1a;在Windows上制作macOS官方安装盘的完整教程 【免费下载链接】gibMacOS Py2/py3 script that can download macOS components direct from Apple 项目地址: https://gitcode.com/gh_mirrors/gi/gibMacOS 想要为Mac制作官方恢复介质却没有苹果电脑&am…

作者头像 李华
网站建设 2026/6/6 19:47:37

医疗文本一键转知识图谱:ChatGPT抽三元组 + Neo4j存查 + Web可视化

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;把临床指南、药品说明书、疾病描述等纯文本&#xff0c;直接变成能搜索、能点选、能看关系的医疗知识图谱。流程分三步&#xff1a;先用ChatGPT API自动识别疾病、药物、症状、治疗方式等实体&#xff0c;并抽取…

作者头像 李华
网站建设 2026/6/6 19:45:41

数据库的“隐形管家“——生动详解触发器

引言&#xff1a;一位尽职尽责的管家 想象你拥有一座豪华庄园&#xff0c;里面雇佣了一位经验丰富的管家。这位管家有个特点&#xff1a;他从不需要你下达直接命令&#xff0c;而是时刻"监视"着庄园里发生的一切。 当有客人进门时&#xff0c;他会自动打开灯、调节空…

作者头像 李华
网站建设 2026/6/6 19:44:44

3个秘籍玩转H5-Dooring:从零基础到精通的快速上手指南

3个秘籍玩转H5-Dooring&#xff1a;从零基础到精通的快速上手指南 【免费下载链接】h5-Dooring H5 Page Maker, H5 Editor, LowCode. Make H5 as easy as building blocks. | 让H5制作像搭积木一样简单, 轻松搭建H5页面, H5网站, PC端网站,LowCode平台. 项目地址: https://gi…

作者头像 李华