首页 > 其他分享 >Flutter 基础知识总结

Flutter 基础知识总结

时间:2024-12-28 15:31:46浏览次数:10  
标签:总结 name int 基础知识 print var Dart Flutter 构造函数

1、Flutter 介绍与环境安装

为什么选择 Dart:

  • 基于 JIT 快速开发周期:Flutter 在开发阶段采用 JIT 模式,避免每次改动都进行编译,极大的节省了开发时间
  • 基于 AOT 发布包:Flutter 在发布时可以通过 AOT 生成高效的 ARM 代码以保证应用性能
  • UI 帧率可达 120 FPS:为了快速流畅的用户体验需要能够在每个动画帧运行大量的代码,不能有周期性的停顿,否则会造成掉帧
  • 单线程:不需要锁,不存在数据竞争和变量状态同步,也没有线程上下文切换的性能损耗和锁导致的卡顿
  • 垃圾回收:多生代(参考了 JVM)无锁垃圾回收器,专门为 UI 框架中常见的大量 Widgets 对象创建和销毁优化

JIT(Just In Time)即时编译,在程序执行期间实时编译为本地机器码;AOT(Ahead Of Time)静态编译,程序运行前编译成本地机器码。在代码的执行效率上,JIT 不如 AOT。

2、Dart 基础语法

2024-5-17.Dart基础一

Dart 不用编译了,dart xxx.dart 直接就执行,不像 Java 需要先 javac 编译出 class 文件再 java xxx.class 执行。

2.1 变量

类型与声明

变量都是引用类型,未初始化的变量的值是 null。

声明变量的方式通常有三种:

  1. Object:与 Java 一样 Object 是所有类的基类,Object 声明的变量可以是任意类型。比如数字(包括 int 类型的数字)、方法和 null 都是对象
  2. var:声明的变量在赋值的那一刻,决定了它是什么类型
  3. dynamic:不是在编译时候确定实际类型的,而是在运行时。dynamic 声明的变量行为与 Object 一样,使用一样,关键在于运行时原理不同

示例代码:

void test1() {
	// 1.通过类型声明变量
	Object i = "Test";
	
	// 2.通过 var 声明变量
	var j = "Test";
	// 报错,声明时已经确定了变量类型,不可更改
	// j = 100;
	
	// 3.声明时没有具体指明是什么类型,那么就是默认的 Object 类型
	var k;
	// 可以为 k 赋值为 Object 的子类型
	k = "Test";
	k = 100;
	
	// 4.dynamic 动态类型可以赋值不同类型
	dynamic z = "Test";
	z = 100;
}

需要注意的地方:

  • 所有类型,没有初始化的变量自动获取一个默认值为 null
  • 声明变量时,可以选择加上具体类型,如int a = 1;,但对于局部变量,按照 Dart 代码风格,使用 var 而不是具体类型

final 与 const

final 声明运行时常量,const 声明编译器常量(相比于运行时常量可让代码运行更高效),二者都用于声明常量,可以替代任何类型,只能在声明时初始化,且不能改变:

void test2() {
	// 1.const 与 final 可以替代任何类型
	const a = 1;
	final b = 1;
	const int c = 1;
	final int d = 1;
	
	// 2.不能通过运行时常量构造编译时常量
	final m = 1;
	// 企图通过运行时常量构造编译时常量,导致 const 值无法确定
	// const n = m + 1;
	
	// 使用编译时能够确定的值构造 const 常量是可以的
	const x = 1;
	const y = x + 1;
}

类的变量可以是 final 但不能是 const。如果 const 变量在类中,需要定义为 static const 静态常量:

class T {
    static const i = 2; // 正确
    const j = 1; // 错误
}

2.2 内置类型

Dart 内置以下类型:

  • numbers
  • strings
  • booleans
  • lists(也被称之为 arrays)
  • maps
  • runes(用于在字符串中表示 Unicode 字符)
  • symbols

数值 num

num 是数字类型的父类,有两个子类 int 和 double。

int 的默认实现是 64 位,如果编译成 JavaScript,就是 32 位。在编码时,如果 int 长度超过 4 个字节,那么 Dart 会将其编译为类似 Java 的 long 类型,否则编译成 Java 中的 short 或 int。

也就是说,int 的长度是动态确定的,可以通过 int 的 bitLength() 确定存储该 int 变量所需要的最小的位数。

但实际上,不应该将 Dart 的 int 和 Java 的 int 做类比,因为前者是一个类,后者是一个基本类型的关键字。从本质上说,二者不是一个东西,没有可比性。

字符串 String

Dart 字符串是 UTF-16 编码的字符序列,使用方法如下:

  • 可以使用单引号或者双引号来创建字符串:

    var name = 'lance';
    // 如果插入一个简单的标识符,而后面没有紧跟更多的字母数字文本,那么 {} 应该被省略
    var a = "my name is $name!";
    var b = "my name is ${name.toUpperCase()}!";
    
  • 与 Java 一样可以使用 + 操作符来把拼接字符串,也可以把多个字符串放到一起来实现同样的功能:

    var a  = "my name is " "lance";
    
  • 使用三个单引号或者双引号可以创建多行字符串对象:

    var s1 = '''
    You can create
    multi-line strings like this one.
    ''';
    
    var s2 = """This is also a
    multi-line string.""";
    
  • 可以通过单引号嵌套双引号,或双引号嵌套单引号进行转义:

    print("'Test'"); // 'Test'
    print('"Test"'); // "Test"
    
  • 也可以使用 Java 的方式转义,或者使用 Dart 的 r 前缀创建一个原始字符串实现转义:

    // 两行输出结果均为 换行符 \n
    print("换行符 \\n");
    print(r"换行符 \n");
    

布尔类型 bool

Dart 的布尔类型 bool 有 true 和 false 两个对象。

列表 List

Dart 的数组是 List 对象,它有两种声明方式:

  1. 当作 List 对象声明:

    // new 可以省略
    var list = new List(1);
    
  2. 当作数组声明:

    var list = [1, 2, 3];
    

通过 for 循环遍历 List 也有两种方式:

for(var item in list) {
    print(item);
}

for(var j = 0;j < list.length; ++j) {
    print(list[j]);
}

当数组与 const 相结合时,需要注意:

	List<int> list1 = const[1,2,3];
	// Unsupported operation: Cannot add to an unmodifiable list
	//list1.add(4);
	
	const List<int> list2 = [1,2];
	// Error: Can't assign to the const variable 'list2'.
	//list2 = list1;
	// Unsupported operation: Cannot add to an unmodifiable list
	//list2.add(4);

const 修是谁,谁就不可变:

  • list1 指向不可变的 [1,2,3],那么就不能修改数组,但是可以指向其他数组对象
  • list2 本身是一个常量引用,那么它就只能指向 [1,2],不能修改索引,也不能修改索引的内容

映射集合 Map

两种声明方式:

var companys = {'a': '阿里巴巴', 't': '腾讯', 'b': '百度'};
var companys2 = new Map();
// 添加元素
companys2['a'] = '阿里巴巴';
companys2['t'] = '腾讯';
companys2['b'] = '百度';

// 获取与修改元素
var c = companys['c']; // 没有对应的 key 返回null
companys['a'] = 'alibaba'; 

const 与 Map 结合的情况与 List 样。

Runes

Runes 主要用于获取特殊字符的 Unicode 编码,或者需要将 32 位的 Unicode 编码转换为字符串。

Dart 表达 Unicode 代码点的常用方法是 \uXXXX,其中 XXXX 是 4 位十六进制值。要指定多于或少于 4 个十六进制数字,需要将值放在大括号中:

var clapping = '\u{1f44f}'; // 5 个 16 进制 需要使用 {}
print(clapping); //

标签:总结,name,int,基础知识,print,var,Dart,Flutter,构造函数
From: https://blog.csdn.net/tmacfrank/article/details/144705172

相关文章

  • Flutter 异步编程简述
    1、isolate机制1.1基本使用Dart是基于单线程模型的语言。但是在开发当中我们经常会进行耗时操作比如网络请求,这种耗时操作会堵塞我们的代码。因此Dart也有并发机制——isolate。APP的启动入口main函数就是一个类似Android主线程的一个主isolate。与Java的Th......
  • 使用kimi快速完成论文仿写的提示词,我帮你总结好了
    在完成论文写作时,很多人都会想到“仿写”,但正确的做法是借鉴而非复制。今天我们将分享如何利用Kimi智能助手来提高论文写作的效率和质量,同时确保原创性和学术诚信。通过Kimi的帮助,可以更快地完成论文写作,同时保持学术的严谨性和创新性。“论文仿写”中可能遇到的问题- 学术......
  • 模拟赛 12.28 总结
    A.回文考虑一个串满足要求会是怎样的,他通过左-shift可以变成一个回文串,等价于一个回文串通过右-shift可以变成这个串,那么我们手玩可以发现要么这个串本身就是回文串,要么就是两个回文串且其中有一个长度是偶数拼起来的。首先第一个就不用说了显然满足,第二个的话可以这样想:假设......
  • 题目集7-8总结:智能家居强电电路模拟系统
    一、前言1.1题目背景题目集7和8以智能家居为主题,通过强电电路的模拟设计,引导我们从基本开关电路到多功能调速器和受控设备模拟的深入探索,体现了物联网技术在智能家居中的实际应用。1.2题目特点知识点:涵盖开关逻辑、电路模拟、受控设备特性、并联与串联电路等核心知识点。题......
  • 题目集7-8总结
    家居强电电路模拟程序-3总结一、前言1.1题目概述本题目是家居强电电路模拟系列的第三次迭代,旨在模拟智能家居中的强电电路系统。相比前两次迭代,本次新增了:受控窗帘设备更复杂的电路结构支持多个并联电路串联的情况串联电路包含其他串联电路的场景1.2知识点分析本题......
  • 2024-2025-1 20241417 《计算机基础与程序设计》第十四周学习总结
    2024-2025-120241417《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标<《C语言程序设计......
  • 《计算机基础与程序设计》第十四周学习总结
    学期(2024-2025-1)学号(20241412)《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第十四周作业)教材学习内容总结复习......
  • AI科研助手开发总结:向量与数据权限的应用(二)
    一、前言继上篇文章:AI科研助手开发总结:向量与数据权限的应用(一)本章根据'向量库内存储数据及权限,向量库统一维护和管理数据权限'方案讨论。二、方案分析-基于向量Fields2.1思路结合橙语AI科研助手和PaperGPT的业务场景,提出基于向量Fields解决数据权限。2.2 分析根据向......
  • 极限挑战---软工总结
    题记:小腿一翘,是生死难料......
  • 基于 Unity 引擎的 VR/AR 音视频编解码技术总结
    在VR/AR应用开发中,音视频编解码技术是实现沉浸式体验的关键环节之一。通过高效的音视频处理,可以实现实时通信、虚拟会议、在线视频流、沉浸式音频等功能。本文将围绕Unity引擎的VR/AR开发需求,系统总结音视频编解码的技术原理、常用工具、实现方案及优化策略。1.VR/AR......