Flutter 学习 - Dart 语言基础

news2024/11/18 15:51:50

文章目录

  • 前言
  • 一、Dart 概述
    • Dart 重要的概念
  • 二、变量与基本数据类型
  • 三、函数
  • 四、运算符
  • 五、流程控制语句
  • 六、异常处理
  • 七、面向对象
    • 构造函数
    • 继承类
    • 抽象类
    • 枚举类型
  • 八、泛型
  • 九、库的使用
    • 引用库
    • 指定库前缀
    • 引用库的一部分
  • 总结技巧
    • 1. 安全调用
    • 2. 设置默认值
    • 3. 简化判断


前言

Dart 作为 Flutter SDK 指定的语言,我们很有必要补充一下 Dart 语言的基础知识,包括它的语法特性、基本语句
面向对象等知识点。

  • Dart 重要概念与常用开发库
  • 变量与基本数据类型
  • 函数
  • 运算符
  • 流程控制语句
  • 异常处理
  • 面向对象
  • 泛型
  • 库的使用
  • 异步支持
  • 元数据
  • 注释

一、Dart 概述

Dart 诞生于 2011年10月10 日, 谷歌 Dart 语言项目的领导人 Lars Bak 在丹麦举行的 Goto 会议上发布, Dart 是一种 结构化的 Web编程 语言,Dart 编程语言在所有现代浏览器和环境中提供高性能。Dart 虽然是谷歌开发的计算机编程语 ,但后来被 ECMA 认定为标准。这门语言用于Web 、服务器、移动应用和物联网等领域的开发,是宽松开源许可证书(修改的 BSD 书)下的开源软件。

那么 FlutterDart 有什么关系?确实有关系。早期 Flutter 团队评估了十多种语言才选择了 Dart ,因为它符合构建用户界面的方式。 以下 Flutter 团队看重 Dart 语言的部分特性:

  • Dart 是 AOT (Ahead Of Time )编译的,编译成快速、可预测的本地代码 ,使 Flutter几乎都可以使用 Dart 编写。这不仅使 Flutter 变得更快,而且几乎所有的组件(包括所有的小部件)都可以定制。
  • Dart 也可以 JIT ( Just In Time )编译,开发周期异常快,工作流颠覆常规(包括 Flutter 流行的亚秒级有状态热重载)。
  • Dart 可以更轻松地创建以 60fps 运行的流畅动画和转场。 Dart 可以在没有锁的情况下进行对象分配和垃圾回收,就像 JavaScript 一样, Dart 避免了抢占式调度和共享内存(因而也不需要锁)。由于 Flutter 应用程序被编译为本地代码,因此不需要在领域之间建立缓慢的桥梁(例如, JavaScript 到本地代码)。 它的启动速度也快得多。
  • Dart 使 Flutter 不需要单独的声明式布局语言(如 JSX或XML ),或单独的可视化界面构建器,因为 Dart 的声明式编程布局易于阅读和可视化。所有的布局使用一种语言,聚集在一处, Flutter 很容易提供高级工具,使布局更简单。
  • 开发人员发现 Dart 特别容易学习,因为它具有静态和动态语言用户都熟悉的特性。并非所有这些功能都是Dart 独有的,但 Dart 将这些功能组合得恰到好处,使 Dart 实现 Flutter 方面独一无二。 因此,没有 Dart ,很难想象 Flutter 像现在这样强大。

Dart 重要的概念

  • 一切皆对象。
  • Dart代码在运行前解析
  • 统一程序入口:main()
  • Dart支持 async/await 异步处理
  • 关键字:abstract ,do, import, super, as, dynamic, in , switch, assert,else, interface, sync*, enum, implements, is, this, async*, export, library, throw, await, external, mixin, true, break ,extends, new, try, case, factory, null, typedef, catch , false, operator, var, class, final, part, void, const, finally, rethrow, while, continue, for, return, with, covariant, get, set, yield*, default, if,
    static, deferred。

在这里插入图片描述
其中如下 个开发库的使用频率最高

  • dart:core:核心库,包括 strings、 numbers、 collections、 errors、 dates、 URIs等。
  • dart:html:网页开发里 DOM 相关的一些库。
  • dart:io: I/O命令行使用的I/O库。
    dart:core 库是 Dart 初始已经包含的库,其他的任何库在使用前都需 加上 import 语句,例如使用 dart:html 可以使用如下的命令:import 'dart:html'; 使用官方提供的 pub 工具可以安装丰富的第三方库。第三方库的地址为 https://pub.dev/

二、变量与基本数据类型

Dart 基本数据类型:Number(int、double)、String、Boolean、List、Map。

// var 生命变量
var name = "张三";

// 常量 final 只能设置一次
final username = "zhangsan";
// 常量 const 
const pi = 3.1415926;

// 字符串
var s = "string";

// 布尔
var boolean = true;

// List
var list = [1,2,3];

// Map
var map = {
	'男': 1,
	'女': 2
}

三、函数

bool equal(String str1, String str2) {
	return str1 == str2
}

可选参数用[ ],如 getInfo(String name, String sex, [String from])
参数默认值,如 getInfo(String name, String sex, [String from = ‘中国’])

函数返回值:

  • 所有函数都会有返回值
  • 如果没有指定默认返回null
  • 没有返回值的函数,系统会隐式添加return语句

四、运算符

在这里插入图片描述
操作符的优先级由上到下逐个减小,上面行内操作符优先级大于下面操作符。

// 如果b为空,将值分配给b;  否则b不变
b ??= value;   

五、流程控制语句

  • if else
  • for
  • while 和 do-while
  • break 和 continue
  • switch 和 case
  • assert 断言
  • try-catch 和 throw
String today = 'Monday'
if(today == 'Monday'){
	print("今天是星期一")
}

var message = new StringBuffer(Hello Dart"); 
for (var i = 0; i < 5; i++) { 
	message.write("!");
	print(message);
}

var _temp = 0;
while(temp < 5){
	_temp++;
}

var arr = [ 0, 1, 2, 3, 4, 5, 6]; 
for (var v in arr) { 
	if (v == 2 ) { 
		break;
	} 
	print(v);
}

String today = 'Monday'; 
switch (today) { 
	case 'Monday': 
		print('星期一');
		break; 
	case 'Tuesday': 
		print('星期二');
		break;
}

六、异常处理

throw FormatException('抛出一个 FormatException 异常');

throw '数据错误!';

try { 
	// · 
} on Exception catch (e) { 
	print('Exception details:\n'); 
} catch (e, s) { 
	print('Exception details:\n $e'); 
	print('Stack trace: \ n $s');
} finally { 
	print('Do some thing: \ n');
}

七、面向对象

构造函数

class User {
  String? name; // name 成员变量
  int? age; // age 成员变量
  
  // 1.构造函数
  User(this.name, this.age);
  // 2.命名构造函数
  User.fromJson(Map json){
    name = json['name'];
    age = json['age'];
  }
  // 3.重定向构造函数
  User.init(String x) : this(x, 10);

  
  toString(){
    return '$name $age';
  }
}



void main() {
  var a = User.fromJson({'name':'zhangsan','age':20});
  print(a.toString());
}

继承类

继承是面向对象编程技术的基石 ,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象 (实 )具有父类的实例域和方法;或子类从父类继承方法,使得子类具有父类相同的行为。 Dart 里使用extends 关键字来创建一个子类,super 关键子来指定父类。接下来定义一个动物类,动物具有吃和跑两种能力。再定义一个人类,人 类是属于动物类的,人类不仅会吃和会跑,人类还会说、会学习。所以人类相当于动物类的 一个扩展。完整的示例如下所示:

class Animal {
  void eat(){
    print('动物会吃');
  }
  void run(){
    print('动物会跑');
  }
}

class Human extends Animal {
  void say(){
    print('人类会说');
  }
  void study(){ 
    print('人类会学习');
  }
}

void main() {
  var animal = new Animal() ; 
  animal.eat(); 
  animal.run(); 

  var human= new Human(); 
  human.eat(); 
  human.run(); 
  human.say(); 
  human.study();
}

抽象类

抽象类类似 Java 语言中的接口。 抽象类里不具体实现方法,只是写好定义接口,具体实现留着调用的人去实现。抽象类可以使用 abstract 关键字定义类。接下来写一个数据库操作的抽象类的例子。定义一个抽象类叫DateBaseOperate,里面定义4个数据库常用的操作方法“增删改查”。再定义一个类命名为DateBaseOperateImpl继承自DateBaseOperate用来实现抽象类里的方法。完整的代码如下所示:

//数据库操作抽象类
abstract class DateBaseOperate {
  void insert(); //定义插入的方法
  void delete(); //定义删除的方法
  void update(); //定义更新的方法
  void query(); //定义一个查询的方法
}

//数据库操作实现类
class DateBaseOperateImpl extends DateBaseOperate {
  //实现了插入的方法
  void insert() {
    print('实现了插入的方法');
  }

  //实现了删除的方法
  void delete() {
    print('实现了删除的方法');
  }

  //实现了更新的方法
  void update() {
    print('实现了更新的方法');
  }

  //实现了一个查询的方法
  void query() {
    print('实现了一个查询的方法');
  }
}

枚举类型

enum Color {
	red,
	green,
	blue
}

List<Color> colors = Color.values;

八、泛型

泛型通常是为了类型安全而设计的,适当的指定泛型会生成更好的代码,可以使用泛型来减少代码重复。Dart 中使用<T>的方式来定义泛型。例如,如果想要List只包含字符串,可以将其声明为list<String>

var names = new List<String>();
names.addAll(['zhangsan','lisi']);

/// 1.用于集合类型
// List: <type>
// Map: <keyType, valueType>
var names = <String>['zhangsan','lisi'];
var weeks = <String, String>{
	'Monday': '星期一',
	'Tuesday': '星期二'
}

// 2. 在构造函数中参数化
var users = new Map<String, User>();

九、库的使用

引用库

// 官方库
import 'dart:io';
// 第三方库
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';

指定库前缀

当引用的库拥有相互冲突的名字,可以为其中一个或几个指定不一样的前缀。

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

Element element1 = new Element(); // 使用lib1
lib2.Element element2 = new lib2.Element(); // 使用lib2

引用库的一部分

如果只需要使用库的一部分内容,可以选择性引用:

  • show 只引用一点;
  • hide 除此之外
// 导入foo
import 'package:lib1/lib1.dart' show foo;
// 除了foo 导入其他所有内容
import 'package:lib2/lib2.dart' hide foo;

总结技巧

1. 安全调用

对于不确定是否为空的对象可以通过 ?. 的方式来访问它的属性和方法以防止空异常

List list;
print(list?.length)

2. 设置默认值

// 如果没有length 则为 -1
var len = list?.length ?? -1; 

3. 简化判断

list = []
list.add(0);
list.add("");
list.add(null);

if(list[0] == null || list[0] == '' || list[0] == 0) {
	print('list[0] is empty');
}

// 简化
if([null, '', null].contains(list[0])) {
	print('list[0] is empty');
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RabbitMQ】快速入门学习MQ

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 1.初识MQ 1.1.同步和异步通讯…

最全面的SpringBoot教程(二)——SpringBoot配置文件

前言 本文为SpringBoot配置文件相关内容介绍&#xff0c;下边将对配置文件分类&#xff0c;yaml基本语法&#xff0c;yaml数据格式&#xff0c;获取数据&#xff0c;profile-运维&#xff0c;项目内部配置文件加载顺序&#xff0c;项目外部配置文件加载顺序等进行详尽介绍~ &a…

Golang实现微信公众号后台

最近在学习Golang&#xff0c;写了个微信公众号项目练练手。 一、开发前准备 1、注册微信公众号 百度搜索微信公众号进入官网&#xff0c;注册一个订阅号&#xff0c;其他信息按要求填写即可。 注册完成后进入个人公众号主页&#xff0c;下拉至设置与开发 点击基本配置&…

π130E31 3.0kV rms 隔离电压200Mbps三通道数字隔离器代替Si8635BC-B-IS1

π130E31 3.0kV rms 隔离电压200Mbps三通道数字隔离器代替Si8635BC-B-IS1&#xff0c;具有出色的性能特 征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器 产品。 智能分压技术(iDivider技术)是荣湃半导体发明的新一代数字 隔离器技术。智能分压技术(iDivide…

【强训】Day08

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程&#xff08;比较简单&#xff09;1. 两种排序方法2. 求最小公倍数&#xff08;主要注意辗转相除法就行&#xff09;答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 以下选项中&am…

Mybatis_plus的一些介绍

这里写目录标题建立数据库utf8mb4是什麽&#xff1f;为什么要用这个呢&#xff1f;utf8mb4_unicode_ci、utf8mb4_general_ci的区别总结数据库连接配置文件创建实体类模型sql日志的输出创建springboot的测试类批量查询建立数据库 注意一下&#xff0c;这个表应该这么去建 utf8…

操作系统权限提升(九)之系统错误配置-泄露敏感信息提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

一刷代码随想录——栈和队列

1 理论基础栈的底层实现可以是vector&#xff0c;deque&#xff0c;list 都是可以的&#xff0c; 主要就是数组和链表的底层实现。我们常用的SGI STL&#xff0c;如果没有指定底层实现的话&#xff0c;默认是以deque为缺省情况下栈的底层结构。栈不提供走访功能&#xff0c;也不…

SAP ABAP——SMARTFORMS(一)【SF概要及文本编辑器】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计专业大二本科在读&#xff0c;阿里云社区专家博主&#xff0c;华为云社区云享专家&#xff0c;CSDN SAP应用技术领域新兴创作者。   在学习工…

利用 Addax 异构迁移数据到 Databend

作者&#xff1a;邰翀 (https://github.com/TCeason) Databend 研发工程师 现在互联网应用越来越复杂&#xff0c;每个公司都会有多种多样的数据库。通常是用最好的硬件来跑 OLTP&#xff0c;甚至还在 OLTP 中进行分库分表来足业务&#xff0c;这样对于一些分析&#xff0c;聚…

微信小程序封装wx.request请求

对微信小程序的印象我还停留在2年前刚入行的时候&#xff0c;那是还不懂什么是Promise&#xff0c;只知道小程序发请求有时候要在success回调中嵌套好多层(后来我才知道这叫回调地狱)。最近刚好有个小程序的项目交给我发开发&#xff0c;加上如今的我自认为对Promise掌握的还可…

Python接口项目实战篇(1)读取xlsx中账户密码,unittest框架实现通过requests接口post登录网站请求,JSON判断登录是否成功

Python接口项目实战篇&#xff08;1&#xff09;读取xlsx中账户密码&#xff0c;unittest框架实现通过requests接口post登录网站请求&#xff0c;JSON判断登录是否成功实现功能描述1.首先获取到接口谷歌浏览器中获取接口信息fiddler里面抓取接口信息2.创建一个xlsx文档3.导入我…

List-反向迭代器

List List接口使用 List&#xff1a;双向带头循环的链表&#xff0c;不支持随机访问&#xff0c;排序就是一个大问题 当大量的插入数据的时候就体现出了优势。 在任意位置以O(1)的时间复杂度插入数据. 只有一种遍历方式就是迭代器&#xff0c;因为他的物理结构是不连续的无…

05_xml

目录0、文档声明1.XML 简介2、xml 的作用&#xff1f;3、xml 语法3.1、文档声明3.2、xml 注释3.3、元素&#xff08;标签&#xff09;3.4、xml 属性3.5、语法规则&#xff1a;3.5.1&#xff09;所有 XML 元素都须有关闭标签&#xff08;也就是闭合&#xff09;3.5.2&#xff09…

uniapp:常用跨端业务组件(ts版本)

插件内组件包含以下功能&#xff1a; 自定义状态栏组件(ZoNavBar)上拉加载状态组件(ZoLoading)弹窗组件(ZoPopup)搜索组件(ZoSearchBar)空数据组件(ZoEmpty)tab标签组件(ZoTabs)tab下拉筛选组件(ZoSelectTabs)底部导航组件(ZoTabBar)cell导航组件(ZoCell) 10.标题内容组件(ZoT…

iptables端口复用后门、sslh

iptables端口复用 创建端口复用链 创建端口复用规则将流量转到22端口 开启开关&#xff0c;接收到一个长为1139的icmp包&#xff0c;则将来源ip添加到LETMEIN表中 如果syn包来源ip处于letmein列表中&#xff0c;则跳转到LETMEIN链处理&#xff0c;有效时间为3600秒 开启复…

c++11 标准模板(STL)(std::multiset)(五)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class multiset;(1)namespace pmr { template <class Key, class Compare std::less<Key>> usi…

PyQt5编程基础 2.2 信号与槽函数

信号与槽函数信号&#xff08;Signal&#xff09;信号是在特定情况下被发射的一种通告。举例&#xff1a;PushButton的信号是鼠标单击时发射的clicked信号槽&#xff08;Slot&#xff09;对信号相应的函数。举例&#xff1a;Qwidget有一个槽函数&#xff0c;功能是关闭窗口信号…

Uncaught SyntaxError: Unexpected token ... 【bug记录】vue项目发布

项目场景&#xff1a; 项目场景&#xff1a;部署vue项目&#xff0c;组件或页面html使用ES6语法导致&#xff0c;界面无法显示。 客户那边采用了比较低版本的浏览器&#xff0c;自己电脑上却没有出现&#xff0c;也不方便调试测试。 问题描述 打开来控制台&#xff0c;看到异…

单片机开发---ESP32S3移植NES模拟器(一)

书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 参考内容 依旧是参考韦东山老师的作品来移植的 《ESP32|爷青回&#xff01;ESP32(单片机) NES模拟器_NES游戏机掌机教程(开源详细讲解实现代码&#xff01;)》 韦老师已经将代码开源&am…