Flutter入门学习Dart语言变量及基本使用概念

目录
  • 正文
  • 变量
    • 变量的声明赋值
    • 变量的划分
    • 默认值
    • 变量的类型推断修饰符
    • Late变量
  • 类型判断is和类型转换as
  • 一些重要概念
    • 空安全和可空类型?
    • 表达式和语句
    • 注释
  • DartPad

正文

Dart是Google发布的开源编程语言,是一种面向对象的语言。其主要应用是Flutter框架开发(Android、IOS),此外,也可以用在服务器、脚本、Web开发中。随着Flutter3.0开始支持全平台开发,Dart也可以实现桌面应用。

关于Dart的介绍不再细说。下面开始Dart的使用介绍

首先记住一点:在Dart中一切皆对象。

Dart中,所有变量引用的都是 对象,每个对象都是一个 的实例。

字符串、数字、函数以及 null 都是对象。除去 null 以外(如果开启了空安全), 所有的类都继承于 Object 类。

Dart官方站点:dart.dev/

变量

语句:

语句是代码中可以被执行的最小表达形式,类似于一句话。代码的执行是以语句为单位进行的。

比如声明语句声明一个变量或函数、赋值语句进行赋值、调用语句执行一个方法等。

变量的声明赋值

声明语句用来表示一个变量名或方法名。赋值语句则通常是给一个变量赋值。

通常变量的声明和赋值是一起的,其语法是 类型 变量名 = 对象;,相当于为对象取了个名字(变量名)。

String name = "张三"; // 声明赋值语句

在声明时进行赋值也就是变量的初始化。

变量是一个引用。由于Dart中“万物皆对象”的原则,变量存储的都是对象的引用,变量指向的是对象。

Dart中不可空对象在声明时必须赋值(即必须初始化)。只有函数内部的本地变量才可以在声明时不需要初始化。 这是Dart的空安全机制的限制。

如下,如果之生命String变量。

比如,函数内部的本地变量可以先声明后赋值使用。

变量的划分

变量或数值,在编程中通常分为:可变量、不可变量(常量)、静态变量(static)

默认声明的变量都是可变量。

int a=10;
a=a*2;

不可变量与可变量相对应,也叫常量,是初始化赋值(或第一次赋值)后不允许修改的变量。通过finalconst修饰符进行限定。

通常推荐使用final定义没有修改需求的量。声明后,final量允许在运行期间根据需要赋值一次,之后不能修改。

const通常用于修饰那些在程序运行前就已经确定的量。比如永恒不变的数字:圆周率、加速度等。需要在声明时初始化赋值,之后不能修改。相对final更为严格。

static关键字用于修改一个类的静态变量,只能用在类中。表示一个类上的变量。

默认值

在 Dart 中,未初始化以及可空类型的变量拥有一个默认的初始值 null。

即便数字也是如此,因为在 Dart 中一切皆为对象。

int? count;
assert(count == null);

assert() 的调用将会在生产环境的代码中被忽略掉。

在开发过程中,assert(condition) 将会在 条件判断 为 false 时抛出一个异常。详情请查阅 Assert

变量的类型推断修饰符

在变量声明时,也可以不同指定变量类型,而是使用Dart的类型推断(Dart分析器analyzer的类型推断),自动推断出一个变量的类型。【如果无法推断出类型,将会作为dynamic类型使用】

var关键字用于普通变量的类型推断。

比如下面,会自动推断出变量a为String,b为int:

var a="a";
var b=1;

finalconst用于修饰一个常量,但同时也可以起到var关键字的类型推断的作用。

finalconst变量只可以被赋值一次,之后不允许修改。

一个 const 变量是一个编译时常量(const 变量同时也是 final 的),必须在声明时赋值。final也可以称作运行时常量。

void foo(){
  final k;
  k=10;
  // k=20; // 只能赋值一次
  const m="m";
  // m="k"; // 不允许修改。
}

const可以用来创建常量值(值是常量,并不是前面的变量是常量。)

var foo = const [];
foo=[1,2];

实例变量可以是final的但不可以是const。const要修饰类中的变量,必须在前面加上static关键字。

class MyClass{
  var a="a";
  static const c=10;
  final f="final";
}

通常,不是很推荐使用类型推断,因为对于编写者和阅读者,明确变量类型非常重要。

Late变量

Dart 2.12引入了late修饰符,作用是:

  • 声明一个可以在声明之后初始化的非空变量
  • 懒初始化一个变量。

第一个作用主要针对顶层变量或实例变量,即上面所说的不可空变量必须在声明时初始化的情况。

如果只是想声明一个变量,仅仅在用到时再赋值,并且Dart不允许这样做时,可以在该变量声明前添加late修饰符:

late String name_late;
void foo(){
  name_late='late变量';
  print(name_late);
}

即使声明late变量时初始化赋值,也只会在该变量第一次使用时进行初始化。一般在以下两种情况时使用懒初始化(lazy initialization)非常方便:

  • 变量可能不是必须的,并且初始化非常耗时。
  • 初始化的实例变量的初始化器需要访问this。

比如下面的temperature变量,如果从不使用,对应的开销很大的readThermometer()函数也将从不会被调用。

late String temperature = readThermometer(); // Lazily initialized.

类型判断is和类型转换as

is用于判断变量的类型。如果对象是指定类型则返回 true

if (p is Person) {
  p.Name = 'xxx';
}

as类型转换:

(p as Person).Name = 'Bob';

一些重要概念

Dart中一切皆对象

空安全和可空类型?

如果开启了空安全,变量在未声明为可空类型时不能为 null。

在类型后添加问号(?)可将类型声明为可空。如int?表示整型或null。

可以通过Object?Objectdynamic显式声明一个任意类型。

dynamic会推迟到运行时执行类型检查,通常应避免使用 dynamic 类型。

Dart支持顶层函数(如main())、类或对象的函数(静态方法和实例方法),也可以在函数内创建函数(函数嵌套或本地函数)

top-level functions

Dart支持顶层变量、类或对象的变量(静态变量和实例变量)。实例变量也称为字段或属性。

Instance variables are sometimes known as fields or properties

表达式和语句

Dart语法中分为

  • 表达式(expressions)—— 有运行时值,即有返回值的是表达式
  • 语句(statements)—— 没有运行时值,即语句没有返回值

一条语句通常包含一个或多个表达式,相反表达式不能直接包含语句。

例如,条件表达式 condition ? expr1 : expr2 的值可能是 expr1expr2。将其与 if-else 语句相比较,if-else 语句没有值。

比如 a==nulla!=null 就是一个条件表达式,其返回false或true值。

if(a==null){ } 就是一个if语句,或者条件语句

Dart没有public、protected和private类似的成员访问限定符

如果一个标识符以下划线 (_) 开头,则表示该标识符在库内是私有的。

underscore (_)

注释

注释是编程中的说明性文字,对代码起到解释说明的作用。不参与实际的代码执行。

  • 单行注释://
  • 多行注释:/* 开始,*/ 结尾,中间的内容为注释

DartPad

DartPad页面是一个可以在浏览器中运行Dart语言的线上工具。

对于一些测试代码、临时运行的代码,可以直接在DartPad运行查看。

也可以根据需要将DartPad进入到自己的站点网页内,方便查看运行代码。

参考

Dart 开发语言概览

以上就是Flutter入门学习Dart语言变量及基本使用概念的详细内容,更多关于Flutter入门Dart语言变量的资料请关注我们其它相关文章!

(0)

相关推荐

  • 混合栈跳转导致Flutter页面事件卡死问题解决

    目录 问题来源 问题难点 问题定位 问题确定 问题解决 总结 问题来源 在我们升级Flutter2.5后,测试在走整个业务流程中发现了有页面卡死现象,于是给我提了一个BUG. 在xx页面多次操作后,页面卡死,页面还可以滚动但是无法跳转,点击长按事件都失效了. 在我多次测试后发现,确实存在这个问题,而且老版本也都存在. 问题难点 复现难 问题定位 最开始,我先确定了失效情况下,事件源头有没有正确发送,所以,先在_dispatchPointerDataPacket方法上添加了断点.结果发现都是正常.

  • Flutter 语法进阶抽象类和接口本质区别详解

    目录 1. 接口存在的意义? 2. 继承 VS 实现 3. Dart 中接口与实现的特殊性 4.Dart 中抽象类作为接口的小细节 1. 接口存在的意义? 在 Dart 中 接口 定义并没有对应的关键字.可能有些人觉得 Dart 中弱化了 接口 的概念,其实不然.我们一般对接口的理解是:接口是更高级别的抽象,接口中的方法都是 抽象方法 ,没有方法体.通过接口的定义,我们可以通过定义接口来声明功能,通过实现接口来确保某类拥有这些功能. 不过你有没有仔细想过,为什么接口会存在,引入接口的概念是为了解

  • Flutter自动路由插件auto_route使用详解

    目录 一.简介 二.基本使用 2.1 安装插件 2.2 定义路由表 2.3 生成路由 2.4 路由跳转 2.5 处理返回结果 三.路由导航 3.1 嵌套导航 3.2 Tab 导航 3.3 PageView 3.4 声明式导航 四.高级用法 4.1 路由控制器 4.2 Paths 4.2.1 Path Parameters 4.2.2 Inherited Path Parameters 4.2.3 Query Parameters 4.2.4 Redirecting Paths 4.3 路由守护

  • Flutter GetPageRoute实现嵌套导航学习

    目录 1. 嵌套导航-GetPageRoute 2. 自定义拓展 3. 使用bottomNavigationBar 4.小结 1. 嵌套导航-GetPageRoute 本文主要介绍在Getx下快速实现一个嵌套导航 嵌套导航顾名思义,我们导航页面中嵌套一个独立的路由,效果如下 点击跳转 代码如下,也是比较简单 return Scaffold( appBar: AppBar(title: const Text('嵌套导航'),), body: Navigator( key: Get.nestedKe

  • Flutter 日历组件简单实现

    目录 前言 安装 效果 demo 演示 业务使用 headerView 使用 配置属性 DEMO 感谢 前言 近期有个业务需求,涉及用户付费相关的计算,需要一个日历组件,组件功能如下: 仅支持从明天开始选择预定日期 仅支持可选范围内的日期 日期的选择是连续的 有个推荐日期,需要联动更新 todo: 支持不连续的日期选择 Github:tw_calendar 安装 dependencies: tw_calendar: latest_version 效果 demo 演示 业务使用 headerVie

  • Flutter入门学习Dart语言变量及基本使用概念

    目录 正文 变量 变量的声明赋值 变量的划分 默认值 变量的类型推断修饰符 Late变量 类型判断is和类型转换as 一些重要概念 空安全和可空类型? 表达式和语句 注释 DartPad 正文 Dart是Google发布的开源编程语言,是一种面向对象的语言.其主要应用是Flutter框架开发(Android.IOS),此外,也可以用在服务器.脚本.Web开发中.随着Flutter3.0开始支持全平台开发,Dart也可以实现桌面应用. 关于Dart的介绍不再细说.下面开始Dart的使用介绍 首先记

  • C、C++、Java到Python,编程入门学习什么语言比较好

    摘要:回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要. 最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C.Java和Python依然蝉联前三位.万万没想到的是,R语言居然冲到了第八位,创下了史上最佳记录.而且后续随着业内对数据统计和挖掘需求的上涨,R语言热度颇有些势不可挡的架势. 然而作为程序员吃饭的工具,编程语言之间也形成了某种鄙视链,各大论坛里弥漫着剑拔弩张的气氛,众口难调.也难怪有很多初学者会有

  • C语言入门学习笔记之typedef简介

    在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称.和#define比较类似.但是又有不同的地方. typedef 创建的符号只能用于数据类型,不能用于值.而#define 创建的符号可以用于值. typedef 是由编译器来解释,而不是预处理器. typedef 使用起来更加灵活. 下面使用typedef定义一个数据类型 int main() { typedef unsigned char BYTE; BYTE c = 10; printf("%d \r\n&quo

  • GO语言入门学习之基本数据类型字符串

    目录 字符串 字符串转义符 byte和rune类型 修改字符串 类型转换 总结 字符串 Go语言中的字符串以原生数据类型出现. Go 语言里的字符串的内部实现使用UTF-8编码. 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符 GO语言中字符串是用双引号包裹的 GO语言中单引号包裹的是字符 // 字符串 s := "Hello 中国" // 单独的字母.汉字.符合表示一个字符 c1 := 'h' c2 := '1' c3 := '中' //

  • C语言入门学习之fgets()函数和fputs()函数

    目录 fgets()函数 fputs()函数 总结 fgets()函数 fgets()函数和gets()函数一样,都是读取字符串,不过gets()函数通常用来从键盘读取输入的字符串,fgets()函数可以通过文件来读取字符串.下面通一个例子来演示fgets()函数的使用方法. int main() { FILE *in,*out; int ret; char ch; char str1[30],str2[30],str3[30]; /* 打开文件 */ in = fopen("123.txt&q

  • Go 语言入门学习之正则表达式

    目录 前言 什么是正则表达式 MatchString 函数 Compile 函数 MustCompile 函数 FindAllString 函数 FindAllStringIndex 函数 Split 函数 Go 正则表达式捕获组 正则表达式替换字符串 ReplaceAllStringFunc 函数 总结 前言 在计算中,我们经常需要将特定模式的字符或字符子集匹配为另一个字符串中的字符串.此技术用于使用特别的语法来搜索给定字符串中的特定字符集. 如果搜索到的模式匹配,或者在目标字符串中找到给定的

  • Go 语言入门学习之时间包

    目录 1.前言 2.日期和时间的表示 当前时间 日期函数 如何在Golang中获取当前UNIX的时间戳 3.访问时间组件的方法 1.前言 时间和日期对于任何编程语言来说都是一个非常重要的包. GO 语言 提供了 ​​time​​ 包来测量和显示时间.既可以根据所选时区获取当前时间,又可以使用 ​​time​​ 包添加当前时区的持续时间等. 2.日期和时间的表示 ​​time​​ 包提供了时间类型,用来表示时间中的一个特定时刻,主要有以下几个函数: Now() 函数:返回当前时区的当前时间 Dat

  • Go语言入门学习之Channel通道详解

    目录 前言 通道的声明 通道的初始化 发送和接收数据 通道的关闭 通道的容量与长度 缓冲通道与无缓冲通道 双向通道和单向通道 遍历通道 fibonacci 数列 参考文章: 总结 前言 不同于传统的多线程并发模型使用共享内存来实现线程间通信的方式,go 是通过 channel 进行协程 (goroutine) 之间的通信来实现数据共享. channel,就是一个管道,可以想像成 Go 协程之间通信的管道.它是一种队列式的数据结构,遵循先入先出的规则. 通道的声明 每个通道都只能传递一种数据类型的

  • JSP自定义标签入门学习

    本文为大家分享了JSP自定义标签入门学习教程,希望大家喜欢. 1.JSP自定义标签: 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作.JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面. JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记.你可以继承SimpleTagSupport类

  • Python入门学习Python流处理过程

    目录 Faust是一个流处理库 将kafka流中的思想移植到Python中 agent是一个async def的函数,因此它还可以异步执行其他操作 使用Kafka topic作为"预写日志" Faust支持任何类型的流数据 Faust是静态类型的 Faust简介 高可用性 分布式的 快速 灵活性 安装 绑定 下载并从源文件中安装 使用开发版本 常见问题 Faust是一个流处理库 将kafka流中的思想移植到Python中 它被用于Robinhood去构建高性能的分布式系统和实时数据通道

随机推荐