首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 预习篇 · 从0开始搭建Flutter工程环境
02 | 预习篇 · Dart语言概览
03 | 深入理解跨平台方案的历史发展逻辑
04 | Flutter区别于其他方案的关键技术是什么?
05 | 从标准模板入手,体会Flutter代码是如何运行在原生系统上的
06 | 基础语法与类型变量:Dart是如何表示信息的?
07 | 函数、类与运算符:Dart是如何处理信息的?
08 | 综合案例:掌握Dart核心特性
09 | Widget,构建Flutter界面的基石
10 | Widget中的State到底是什么?
11 | 提到生命周期,我们是在说什么?
12 | 经典控件(一):文本、图片和按钮在Flutter中怎么用?
13 | 经典控件(二):UITableView/ListView在Flutter中是什么?
14 | 经典布局:如何定义子控件在父容器中排版的位置?
15 | 组合与自绘,我该选用何种方式自定义Widget?
16 | 从夜间模式说起,如何定制不同风格的App主题?
17 | 依赖管理(一):图片、配置和字体在Flutter中怎么用?
18 | 依赖管理(二):第三方组件库在Flutter中要如何管理?
19 | 用户交互事件该如何响应?
20 | 关于跨组件传递数据,你只需要记住这三招
21 | 路由与导航,Flutter是这样实现页面切换的
22 | 如何构造炫酷的动画效果?
23 | 单线程模型怎么保证UI运行流畅?
24 | HTTP网络编程与JSON解析
25 | 本地存储与数据库的使用和优化
26 | 如何在Dart层兼容Android/iOS平台特定实现?(一)
27 | 如何在Dart层兼容Android/iOS平台特定实现?(二)
28 | 如何在原生应用中混编Flutter工程?
29 | 混合开发,该用何种方案管理导航栈?
30 | 为什么需要做状态管理,怎么做?
31 | 如何实现原生推送能力?
32 | 适配国际化,除了多语言我们还需要注意什么?
33 | 如何适配不同分辨率的手机屏幕?
34 | 如何理解Flutter的编译模式?
35 | Hot Reload是怎么做到的?
36 | 如何通过工具链优化开发调试效率?
37 | 如何检测并优化Flutter App的整体性能表现?
38 | 如何通过自动化测试提高交付质量?
39 | 线上出现问题,该如何做好异常捕获与信息采集?
40 | 衡量Flutter App线上质量,我们需要关注这三个指标
41 | 组件化和平台化,该如何组织合理稳定的Flutter工程结构?
42 | 如何构建高效的Flutter App打包发布环境?
43 | 如何构建自己的Flutter混合开发框架(一)?
44 | 如何构建自己的Flutter混合开发框架(二)?
当前位置:
首页>>
技术小册>>
Flutter核心技术与实战
小册名称:Flutter核心技术与实战
### 06 | 基础语法与类型变量:Dart是如何表示信息的? 在Flutter这一强大的跨平台开发框架中,Dart语言作为其核心编程语言,扮演着至关重要的角色。Dart不仅提供了高效、安全且易于学习的语法特性,还通过其严格的类型系统和丰富的内置类型,为开发者构建复杂应用提供了坚实的基础。本章将深入探讨Dart的基础语法与类型变量,揭示Dart是如何精准且灵活地表示信息的。 #### 一、Dart基础语法概览 Dart的语法设计旨在平衡简洁性与表达力,让开发者能够快速上手并编写出既清晰又高效的代码。以下是一些Dart基础语法的关键要点: ##### 1. 注释 Dart支持单行注释(以`//`开头)和多行注释(以`/*`开头,以`*/`结束)。注释用于提高代码的可读性,不会被编译器执行。 ```dart // 这是一个单行注释 /* 这是一个 多行注释 */ ``` ##### 2. 变量声明 Dart是动态类型语言,但支持显式类型声明,以增强代码的可读性和健壮性。变量使用`var`、`let`(Dart中实际上只有`var`和`final`/`const`,这里`let`用于类比其他语言)或具体类型来声明。 ```dart var name = 'Flutter'; // 隐式类型推断 String anotherName = 'Dart'; // 显式类型声明 final pi = 3.14; // 不可变的final变量 const e = 2.718; // 编译时常量 ``` ##### 3. 控制流 Dart提供了标准的控制流语句,包括`if`、`else`、`for`、`while`、`do-while`以及`switch`(支持字符串和表达式作为case条件)。 ```dart if (x > 0) { print('x is positive'); } else if (x < 0) { print('x is negative'); } else { print('x is zero'); } for (int i = 0; i < 5; i++) { print(i); } // 使用forEach遍历集合 [1, 2, 3].forEach((item) => print(item)); ``` ##### 4. 函数 Dart中的函数是一等公民,可以赋值给变量或作为参数传递给其他函数。函数可以拥有命名参数、可选参数和位置参数。 ```dart void greet(String name, int age) { print('Hello, $name. You are $age years old.'); } // 命名参数和可选参数 void greetWithOptions({String name = 'World', int age = 0}) { print('Hello, ${name ?? 'Unknown'}. You are ${age} years old.'); } ``` #### 二、Dart中的类型变量 Dart的类型系统是其强大特性的重要组成部分,它允许开发者明确指定变量、函数参数和返回值的类型,从而提高代码的安全性和可维护性。 ##### 1. 基本类型 Dart提供了多种基本类型,包括`Number`(细分为`int`、`double`)、`String`、`Boolean`、`List`(动态数组)、`Set`(无序不重复集合)、`Map`(键值对集合)等。 - **Number**:Dart中的数字可以是整数(`int`)或浮点数(`double`)。默认情况下,数值字面量被视为`double`类型,但可以通过在数值后加`L`(小写L,不是数字1)来指定其为`int`类型。 - **String**:Dart中的字符串是不可变的,可以使用单引号(`'`)、双引号(`"`)或三引号(`'''`或`"""`,用于多行字符串)定义。字符串支持模板字符串,允许在字符串中嵌入表达式。 - **Boolean**:布尔类型有两个值:`true`和`false`。 - **List**、**Set**、**Map**:这些集合类型提供了丰富的API来操作元素,如添加、删除、查找等。 ##### 2. 自定义类型 Dart支持通过`class`和`enum`关键字定义自定义类型。类(`class`)是Dart中最基本的面向对象编程结构,可以包含属性(字段)、方法(函数)以及构造函数。枚举(`enum`)是一种特殊的类,用于表示一组固定的常量值。 ```dart class Person { String name; int age; Person(this.name, this.age); // 构造函数 void greet() { print('Hello, my name is $name and I am $age years old.'); } } enum Color { RED, GREEN, BLUE } ``` ##### 3. 类型注解与类型推断 Dart允许开发者在变量声明、函数参数和返回值上添加类型注解,以明确指定期望的类型。然而,Dart也具备强大的类型推断能力,能够在不显式指定类型的情况下自动推断出变量的类型。 ```dart // 显式类型注解 String name = 'Flutter'; // 隐式类型推断 var age = 30; // Dart推断出age是int类型 // 函数类型注解 void processData(List<int> data) { // 处理数据 } ``` ##### 4. 泛型 Dart支持泛型,允许开发者在类或函数定义时指定一个或多个类型参数。泛型提高了代码的重用性、可读性和类型安全性。 ```dart class Box<T> { T content; Box(this.content); void setContent(T newContent) { content = newContent; } } var box = Box<String>('Hello'); box.setContent('World'); print(box.content); // 输出:World ``` #### 三、Dart的类型系统特性 Dart的类型系统不仅严格而且灵活,它通过一些独特的特性来增强代码的表达力和安全性。 ##### 1. 可空类型(Null Safety) 从Dart 2.12开始,Dart引入了可空类型(Null Safety)特性,要求开发者显式地处理空值。这意味着,除非明确标记为可空(使用`?`后缀),否则变量不能持有`null`值。这一特性极大地减少了空指针异常的发生,提高了代码的健壮性。 ```dart String? nullableString; // 可空字符串 String nonNullableString = 'Hello'; // 不可空字符串 // 访问nullableString前必须检查是否为null if (nullableString != null) { print(nullableString); } ``` ##### 2. 类型别名 Dart允许使用`typealias`关键字定义类型别名,这有助于简化复杂类型的声明,提高代码的可读性。 ```dart typealias StringList = List<String>; StringList names = ['Alice', 'Bob', 'Charlie']; ``` ##### 3. 动态类型与`any` 尽管Dart鼓励显式类型注解,但在某些情况下,开发者可能希望使用动态类型(即不指定具体类型),这时可以使用`dynamic`关键字。然而,需要注意的是,过度使用`dynamic`会失去类型检查带来的安全性优势。Dart 2.12及以后版本没有直接提供`any`类型,但`dynamic`在一定程度上扮演了类似角色。 ```dart dynamic dynamicVar = 'Hello'; dynamicVar = 123; // 动态类型允许改变变量的类型 ``` #### 四、总结 通过本章的学习,我们深入了解了Dart的基础语法与类型变量。Dart以其简洁而强大的语法、严格且灵活的类型系统,为Flutter应用开发提供了坚实的基础。无论是变量声明、控制流语句、函数定义,还是自定义类型、泛型、可空类型等高级特性,Dart都展现出了其作为现代编程语言的卓越之处。掌握这些基础知识,将为我们后续深入学习Flutter框架和构建复杂应用打下坚实的基础。
上一篇:
05 | 从标准模板入手,体会Flutter代码是如何运行在原生系统上的
下一篇:
07 | 函数、类与运算符:Dart是如何处理信息的?
该分类下的相关小册推荐:
web前端开发性能优化实战
Javascript重点难点实例精讲(一)
深入学习前端重构知识体系
WebSocket入门与案例实战
npm script实战构建前端工作流
Node.js 开发实战
经典设计模式Javascript版
剑指javascript-ES6
KnockoutJS入门指南
javascript设计模式原理与实战
零基础学JavaScript
编程入门课:Javascript从入门到实战