Dart+Flutter入门记录

2050 字
10 分钟
Dart+Flutter入门记录

爆竹声中,新的一年已经悄然来临。新年新气象,自然也要学点新技术。借着天外天工作室新生起飞赛中维护微北洋app的机会,在此记录下本人学习dart和flutter的过程。

Important

本文仅作为自己学习的记录,内容较为简陋,并不适合对编程一无所知的小白;如果你希望通过阅读本文学习,强烈建议在已经掌握一门语言的基础下继续。

Dart基础语法#

写在开始之前:语法的基础框架#

众所周知,编程语言代码格式分为两派:括号派和缩进派。前者以传统语言(c/c++, java…) 为代表,后者以python为代表。

两派之间的争斗也由来已久:前者括号一多起来就确定不清层数,后者更是被戏称为’拿着游标卡尺写代码’.

Dart的语法规范属于前者,使用大括号确认基本框架,每行后需要加分号。不过需要注意的是,Android Studio中,Dart代码文件的tab缩进默认为2空格而非4空格,初次学习需要一定时间适应。

从变量开始#

变量的声明#

一般声明#

dart的变量声明有点缝合怪的味道:它既可以像javascript 那样通过var声明变量,又可以像传统c/c++那样使用变量的类型名进行声明。在前一种情况下,编译器内部将会自动推断变量的类型。

var a = 1;
int b = 2;

使用var声明的变量,其类型在第一次赋值后就被确定,不能再赋予其他类型的值。

常量声明 — const#

const 用于声明代码编译前就已经确定的值,无法被修改,且不允许表达式中存在变量。

常量声明 — final#

final 用于声明再运行过程中被确定的值,在第一次被赋值后无法被修改。

变量的类型#

Dart中,变量主要有以下几种类型;

  • 数字:int/double/num
  • 布尔:bool
  • 字符串:String
  • 列表:List
  • 字典/映射:Map

数字:int/double/num#

int用于表示整型数字,double用于表示小数,num两者均可。

Note

double和int之间不能直接赋值,需要使用toInt()toDouble()进行转换;
num可以直接被两者赋值,但反过来使用也需要上面的转换函数。

字符串:String#

Dart中的字符串支持使用单引号或双引号括起,支持拼接及模板字符串。
语法如下:

void main(List<String> args) {
String text = '现在是${Datetime.now()}';
print(text);
}

使用 $${} 进行模板操作。
当存在模板中的内容是一个表达式的时候需要使用后者。在实际代码中,更推荐使用后者。

布尔类型:bool#

Dart中的真或假使用小写的 truefalse 表示。

bool I_am_mtf = false;

列表:List#

使用方式比较类似于python。

List students = ['Alice','Bob'];

列表的常用方法如下:

  • 在尾部添加一个元素:list.add(element)
  • 在尾部添加一个列表:list.addAll(newList)
  • 删除满足内容的第一个元素:list.remove()
  • 删除最后一个元素:list.removeLast()
  • 删除给定范围内数据:list.removeRange(start,end)

dart中索引范围的取定与其他编程语言保持一致:包括头部,不包括尾部。

列表的常用操作和属性如下:

  • 循环(类似于python的for … in …):list.forEach( (item) {} )
  • 是否都满足条件:list.every( (item) { return 布尔值 } )
  • 筛选出符合条件的数据:list.where( (item) { return 布尔值 } )
  • 列表的长度:list.length
  • 第一个元素:list.first
  • 最后一个元素:list.last
  • 列表是否为空:list.isEmpty

对于前三种常用操作,给出如下示例代码:

students.forEach((item) { // 迭代打印每个元素
print(item);
})
print(students.every((item) { // 检测每个元素是否都以'A'开头
return item.toString().startsWith("A");
}))
print(students.where((item) { // 筛选出所有以 "A" 开头的元素并组成新列表打印
return item.toString().startsWith("A");
}).toList())

等价于以下 python 代码:

for item in students: # 第一种
if item[0] == 'A':
print(item)
# 第二种:似乎最标准的写法就是一行流
print(all(str(item).startswith("A") for item in students))
# 第三种
result = []
for item in students:
if str(item).startswith("A"):
result.append(item)
print(result)
# 也可以一行流
print([item for item in students if str(item).startswith("A")])

很奇怪,对吧?我也这么觉得

字典:Map#

在python中,它有一个更亲切的名字:Dict .

使用方法如下:

Map a = {"breakfast":"1","lunch":"2"};

字典的常用操作方法如下:

  • 循环(类似于python的for … in …):map.forEach( (item) {} )
  • 添加字典(合并新字典):map.addAll(newMap)
  • 是否包含某个key:map.containsKey()
  • 删除一个key:map.remove(key)
  • 清空字典:map.clear()

动态类型:Dynamic#

dynamic 类型用来声明动态类型,即允许变量运行时自由改变类型,同时绕过编译时的静态检查。

使用方法如下:

dynamic freedom = 1;
free = '';
free = false;
free = [1];
free = {}; // 以上操作均为合法

空安全机制#

简单来说,与其他类型的语言不同,Dart语言默认不允许变量为空值(除非你使用上面提到的dynamic)。如果你需要使用空变量相关的特性,需要使用下列空安全操作符:

操作符符号作用示例
可空类型?声明可空变量String? → 允许String或null
安全访问?.对象为null时跳过操作,返回nulluser?.name → 若user为null则返回null
非空断言!.开发者保证变量非空(否则运行时崩溃)name!.length → 断言name非空
空合并??左侧为null时返回右侧默认值name??"Guest" → name为null时返回”Guest”

运算符#

和其他编程语言一样,dart的常用运算符分为以下几类;算数运算符、赋值运算符、比较运算符、逻辑运算符。

需要注意的是,dart语言中,整除符号是 ~/ .毕竟 // 被拿来用作注释标记了

赋值、比较、逻辑运算符与其他语言保持一致。

流程控制#

Dart中的逻辑控制(if分支语句、三元运算符、switch/case、while循环、for循环)和c++保持一致。

函数#

定义#

Dart中的函数定义方法也和c++保持一致。

不同的是,dart的返回值类型可以省略;语言内部会自动推断返回类型为dynamic.

Important

虽然返回值类型可以省略,但是明确返回值类型是更推荐的编程习惯。

参数#

在dart中,为函数传参可以说是品尝dart这坨构式不得不品的一环。

简单来说,dart语言中函数的参数分为三类:必传参数、可选位置参数、可选命名参数。

  • 必传参数无需多言,正常调用即可。
  • 可选位置参数必须位于必传参数后面,采用中括号包裹,传递时按照顺序传递;
  • 可选命名参数必须位于必传参数后面,采用大括号包裹,传递时按照参数名:值的方式传递,无需关注顺序。

后面两类的区别和建议如下:

  • 两种参数都可以设定默认值。
  • 参数少且顺序固定时建议使用可选位置参数,参数多且需要明确含义时建议使用可选命名参数。
Note
  • 一个函数只能采用其中一种可选参数风格,不可混用。
  • 对于这两个名词,建议理解为可选的位置参数可选的命名参数,两者都是可选参数,区别在于一个强调位置,一个强调命名。
  • 千万不要理解为可选位置的参数可选位置的参数!这样恰好就反了~
  • 可选命名参数可以使用 required 关键字强制调用时传入,此时不再是“可选”。

匿名函数#

在dart中,可以声明一个没有名称的函数赋值给变量进行调用,使用Function关键字。

示例如下:

void main(List<Strings> args) {
onTest(test);
}
Function callback = () {
print("test");
}
void onTest(Function callback) {
callback();
}

箭头函数#

当函数体只有一行代码时,可以使用箭头函数(=>)编写,省略return关键字。

示例如下:

int add(int a,int b) => a + b;

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Dart+Flutter入门记录
https://github.com/MuRongPIG
作者
MuRongPIG
发布于
2026-02-24
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
MuRongPIG
自无梦的长夜亮起,绽放在终竟的明天。
公告
欢迎来到我的博客!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
5
分类
3
标签
7
总字数
23,469
运行时长
0
最后活动
0 天前

目录