Dart基础知识

Flutter —— dart基础语法 Flutter —— dart基础语法(1)1. Flutter 项目创建2. Dart 语法2.1 var、final和const2.2 num2.3 string2.4 list 和 map2.5 ??= 和 ??2.6 方法 和 箭头函数2.7 方法的可选参数2.8 方法作为参数传递2.9 匿名函数2.10 闭包 1. Flutter 项目创建 Flutter配置完之后,就可以在Android studio 创建 Flutter项目啦, 点击Create New Flutter Project之后, 阅读详情

运算符

  • 地板除(~/)
  • 类型判断运算符(is | is!)判断某个变量是否属于某种类型
  • 避空运算符(?? | ??=)
  • 条件属性访问(?.)
  • 级联运算符(…)
    • myObject.myMethod(); //返回myMethod()的返回值
    • myObject…myMethod()…myMethod2(); //返回myObject的引用

申明函数

  • 直接声明不需要function关键字
  • dart中的箭头函数只是函数的一种简写形式
  • 匿名函数
  • 立执行函数
// 申明函数
void printHello() {
	print('hello world');
}

// 返回类型为int
int getNum() {
	return 123;
}

// 匿名函数 箭头函数
var myPrint = (value) => {
	print(value1);
}


-----------------------------------------------------

void main() {
	printHello();
	print(getNum());
	myPrint('x');
	
// 立执行函数
	((int n){
		print(n)
	})(12);
}

函数参数

  • 必填参数
    • 参数类型 参数名称
  • 可选参数
    • 放在必选参数后面
    • 通过中括号包裹起来
    • 带默认值的可选参数
  • 命令参数
    • 用大括号包裹起来
    • 调用函数时,命名参数的名称与声明函数中的名称保持一致
  • 函数参数
void main() {	
	String userInfo(String name, [int age = 18], { int gender = 0 }) {
		return 'name: $name, 年龄: $age';
	}

	String res = userInfo('max', 20, gender: 1);
	print(res);

	const myPrint = (res) => {
		print(res)
	}
	
	List l = [1, 2, 3]
	
	l.forEach(myPrint)
}

作用域和闭包

和js一样

异步函数

  • JS中,异步调用通过Promise 实现
    • async 函数返回一个Promise,await 用于等待 Promise
  • Dart中,异步调用通过Future 实现
    • async 函数返回一个Future,await 用于等待 Future
import 'package:http/http.dart' as http;  //pub.dev 类似npm	

Future getdata() {
	final url = 'https://httpbin.org/ip';
	return http.get(url).then(res => {
		print(res.body);
		String ip = jsonDecode(res.body)['origin'];
		return ip;
	}).catch(err => {
		print(err);
	})
}

Future getdata() async {
	final url = 'https://httpbin.org/ip';
	final res = await http.get(url)
	String ip = jsonDecode(res.body)['origin'];
	return ip;
}

类

  • 类是通过 class 声明的代码段,包含属性和方法。
    • 属性:用来描述类的变量
    • 方法:类中的函数称为类的方法
  • 对象是类的实例化结果
  • 编程方式
    • dart 是面向对象的编程语言(OOP)
    • Js 是面向过程的编程语言(POP)
class Person {
	String name = 'lys';
	
	void getInfo() {
		print('我是:$name')
	}
}

void main() {
	Persion p = new Persion();  //实例化
	// 访问属性
	print(p.name)
	// 访问方法
	p.getInfo()
	// Dart 中所有内容都是对象
	Map m = new Map();
	print(m.length);
	m.addAll({ 'name': 'aaa', 'age': 14 })
}

构造函数

  • 默认构造函数
    • 与类同名的函数,在实例化时,自动被调用
  • 命名构造函数
    • 在类中使用命名构造器(类名.函数名)实现多个构造器,可以提供额外的清晰度(new Point.origin())
  • 常量构造函数
    • 如果类生成的对象不会改变,可以通过常量构造函数使这些对象成为编译时常量
  • 工厂构造函数(单例模式)
    • 工厂函数不能进行实例化操作
class Person {
	String name;
	
	static Person instance;
	
	factory Person([String name = 'maxloong']) {
		if(Person.instance == null) {
			// 第一次实例化
			Person.instance = new Person.newSelf(name);
		}
		return Person.instance;
	}
	// 命名构造函数
	Person.newSelf(this.name);
}

访问修饰符

  • Dart和Typescript不一样,没有访问修饰符(public,protected,private,readonly)
  • Dart类中,默认的访问修饰符是public
  • 如果属性或方法以_(下划线)开头,则表示私有private
  • 只有把类单独抽离出去,私有属性和方法才起作用

Getter和Setter

  • Getter(获取器)是通过get关键字修饰的方法
    • 函数没有小括号,访问时也没有小括号(像访问属性一样访问方法)
  • Setter(修改器)是通过set关键字修饰的方法
    • 访问时,像设置属性一样给函数传参

初始化列表

  • 作用:在构造函数中设置属性的默认值
  • 时机:在构造函数体执行之前执行
  • 语法:使用逗号分隔初始化表达式
  • 场景:常用于设置final常量的值
class Rect {
	int height;
	int width;
	
	Rect(): height = 2, width = 10 {
		print(this.width, this.height);
	}

	getArea() {
		return this.height * this.width;
	}
}

static

  • static 关键字可以指定静态成员
    • 静态属性
    • 静态方法
  • 静态成员可以通过类名称直接访问(无需实例化)
    • 实例化是比较消耗资源的,声明静态成员,可以提高程序性能
  • 静态方法不能访问非静态成员,非静态方法可以访问静态成员
    • 静态方法中不能使用this关键字
    • 不能使用this关键字,访问静态属性

元数据

  • 元数据以@开头,可以给代码标记一些额外的信息
    • 元数据可以用来库,类,构造器,函数,字段,参数或变量声明的前面
  • @override(重写)
    • 某些方法添加该注释后,表示重写了父类中的同名方法
  • @required(必填)
    • 可以通过@required来注解Dart中的命名参数,用来指示它是必填参数
  • @deprecated(弃用)
    • 若某类或某方法加上该注解之后,表示此方法或类不再建议使用

继承

  • 根据类的先后顺序,可以将类分为父类和子类
  • 子类通过extends 关键字继承父类
    • 继承后,子类可以使用父类中,可见的内容(属性或方法)
  • 子类可以通过@override元数据来标记重写父类方法
  • 子类当中,可以通过Super关键字来引用父类中,可见的内容
    • 属性
    • 方法(普通构造函数,命名构造函数)

抽象类

  • 抽象类是用abstract关键字修饰的类
  • 抽象类的作用是充当普通类的模板,约定一些必要的属性和方法
  • 抽象方法是指没有方法体的方法
    • 抽象类中一般都有抽象方法,也可以没有抽象方法
    • 普通类中,不能有抽象方法
  • 抽象类不能被实例化
  • 抽象类可以被普通类继承
    • 如果普通类继承抽象类,必须实现抽象类中所有的抽象方法
  • 抽象类还可以充当接口被实现
    • 如果把抽象类当做借口实现的话,普通类必须得实现抽象类李敏啊定义的所有属性和方法

接口

  • 接口在Dart中就是一个类(只是用法不同)
    • 与java不同,java中的接口需要用interface关键字声明;Dart中不需要
    • 接口可以是任意类,但一般使用抽象类做接口
  • 一个类可以实现多个接口,多个接口用逗号分隔
    • class MyClass impleimplements Interface1,Interface2 { … }
    • 接口可以堪称一个个小零件。类实现接口就相当于组装零件
    • 普通类实现接口后,必须重写接口所有的属性和方法
abstract class Processor {
	String cores;
	arch(String name);
}

abstract class Camera {
	String resolution;
	brand(String name);
}

class Phone implements Processor, Camera {
	
	String cores;
	
	
	String resolution;
	
	
	arch(String name) {
		print(0, name)
	}
	
	
	brand(String name) {
		print(1, name)
	}
}
void main() {
	
}

泛型

  • 泛型指的是 在函数,类,接口中指定宽泛数据类型的语法

    • 泛型函数
    • 泛型类
    • 泛型接口
  • 通常,在尖括号中,使用一个字母来代表类型,例如E,T,S,K和V等

    • 返回类型函数名<输入类型>(参数类型 参数){ 函数体 }
    T getData<T>(T value) {
    	return value;
    }
    
    getData<int>(12);
    getData<String>("12");
    
  • 使用泛型减少重复代码

  • 范型函数

    T getData<T>(T value) {
    	return value;
    }
    
    
  • 泛型类

    // 普通
    class CommonClass {
    	Set s = new Set<int>();
    
    	void add(int value) {
    		this.s.add(value);
    	}
    	
    	void info() {
    		print(this.s);
    	}
    }
    
    void main() {
    	CommonClass c = new CommonClass();
    	c.add(1);
    	c.info();
    
    	GenericsClass g = new GenericsClass<String>();
    	g.add("1");
    	g.info();
    }
    
    // 泛型类
    class
     GenericsClass<T> {
     	Set s = new Set<T>();
    	
    	void add(T value) {
    		this.s.add(value);
    	}
    
    	void info() {
    		print(this.s);
    	}
     }
    
  • 泛型接口

    abstract class ObjCache {
    	getBykey(String key);
    	void setBykey(String key, Object value);
    }
    abstract class StringCache {
    	getBykey(String key);
    	void setBykey(String key, String value);
    }
    
    abstract class Cache<T> {
    	getBykey(String key);
    	void setBykey(String key, T value);
    }
    
    // 文件缓存
    class FileCache<T> implements Cache<T> {
    	
    	getBykey(String key) {
    		return null;
    	};
    	void setBykey(String key, T value) {
    		print("文件缓存");
    	};
    }
    
    // 内存缓存
    class MemoryCache<T> implements Cache<T> {
    	
    	getBykey(String key) {
    		return null;
    	};
    	void setBykey(String key, T value) {
    		print("文件缓存");
    	};
    }
    void main() {
    	FileCache fc = new FileCache<String>();
    	fc.setBykey('foo', 'bar');
    
    	FileCache fc = new FileCache<Map>();
    	fc.setBykey('index', {name: '张三丰'});
    
    	MemoryCache mc = new MemoryCache<String>();
    	mc.setBykey('foo', 'bar');
    }
    
  • 泛型类型限制

    	class SomeBaseClass {
    		// ...
    	}
    
    	class Foo<T extends SomeBaseClass> {
    		String toString() => "Instance of 'Foo<$T>'";
    	}
    	
    	void main() {
    		var someBaseClassFoo = Foo<SomeBaseClass>();
    		print(someBaseClassFoo);
    	}
    

枚举

  • 枚举是数量固定的常量值,通过enum关键字声明
    • enum Color { red, green, blue }
  • 枚举的values 常量,可以获取所有枚举值列表
    • List colors = Color.values;
  • 可以通过index获取值的索引
    • assert(Color.green.index === 1);
C#并发写文件实战:用ReaderWriterLockSlim解决日志乱码与覆盖 多线程环境下,文件写入并不像看起来那么简单。多个线程同时操作同一个文件时,可能会引发内容交错、数据覆盖甚至程序卡死等问题。这背后涉及操作系统文件系统对并发写入的处理机制,以及FileStream、StreamWriter等高层封装在实际运行中的行为。C#中的读写锁ReaderWriterLockSlim专门针对“读多写少”的场景,允许读锁之间共享,写入时独占,既能保证数据一致性,又能提升整体吞吐量。在日志系统、配置文件更新、临时缓存文件等场景中,正确运用读写锁能有效避免并发导致的文件损坏与性能损耗。本文从底 阅读详情

相关推荐

「 Dart 」一文了解 Dart 基础知识

本文介绍了 Dart 的环境搭建以及 Dart 语法,包括变量与常量、数据类型、函数、操作符、类、泛型等等。 安装 在 Dart for Windows (gekorm.com) 下载安装包安装 Dart SDK。 在 VSCode 中安装 Dart 和 Code Runner 插件。 新建一个 .dart 文件,输出 “Hello dart!” : void main() { print('Hello dart!'); } Run Code: Hello dart! 变量和常量

Aerfa789的博客 1868

dart的??=运算符

在Flutter开发中,由于我们经常需要处理null值或设置默认值,?=运算符可以让我们的代码更加简洁易读。=运算符为设置默认值提供了一种简洁的语法,特别适用于初始值可能为null的情况。这意味着,如果a不为null,则a保持原值;如果a为null,则将a赋值为b。如果左边的操作数为null,则将其赋值为右边的操作数;这里,因为name初值为null,所以会被赋值为’Guest’。这个运算符在为可能为null的变量设置默认值时非常有用。=是Dart中的null-aware运算符。

江上清风山间明月的博客 1091

【Flutter 面试题】 讲一下 Dart 中 ?? 与 ??= 的区别

在实际应用中,这两种运算符常用于数据处理和状态管理,特别是在处理来自外部数据源的不确定性数据时。例如,在网络请求返回的数据可能为 null 的场景下,使用 ?? 可以为某些关键变量提供默认值,从而确保程序逻辑的连贯性和稳定性。同样,??= 在设置配置选项的默认值时也极为有用,它允许程序在不覆盖已有值的情况下,为配置项提供初始值。

Code Metaverse 1103

Dart中的final和const 及 ??= 用法

const 类中只有静态成员才能用const修饰 const是编译时常量,在编译时值就要确定下来 final final常量只能被初始化一次,这个值可以在运行时确定 当final修饰的是一个引用时,只是引用的值不能被改变,而引用指向的对象的属性如果不是常量的话是可以被任意改变的 final值必须被初始化,但是这个过程可以必须在构造器的body部分执行之前。可以在声明时,也可以在初始list中初始化 Flutter中的 ??= 是在看Flutter源码时发现的,测试发现相当于 if(xxx=.

jia635的专栏 1409

我的交叉验证翻车实录:从‘炼丹’到可靠评估,我是怎么用五折验证拯救我的图像分割模型的

本文分享了作者在医学图像分割模型评估中从失败到成功的实战经验。通过引入五折交叉验证方法,解决了传统数据划分的局限性,显著提升了模型评估的稳定性和泛化能力。文章详细介绍了Python实现、数据准备策略和训练流水线改造,为AI医疗影像分析提供了可靠的技术方案。

weixin_42625070的博客 269

CloudSat卫星数据高效下载与自动化处理指南

本文详细介绍了CloudSat卫星数据的高效下载与自动化处理方法,包括交互式图形界面和wget批量下载技巧,以及使用Python脚本实现自动化处理和数据质量控制。内容涵盖从数据准备到实战应用的完整流程,特别适合气象研究和气候建模领域的工作者提升工作效率。

weixin_28700411的博客 233

dart ?? 运算符

??=,如果变量没有赋值才进行赋值,否则不进行赋值 //??=,如果变量没有赋值才进行赋值,否则不进行赋值 b ??= 10; print(b);

zyx的博客 6373

基于计算机视觉的Windows自动化工具openclaw-win:从原理到实战

计算机视觉与自动化技术正深刻改变人机交互方式,其核心在于让机器具备“感知-决策-执行”的能力。通过图像采集与处理算法,程序可以识别屏幕上的特定元素;结合模拟输入技术,便能自动执行点击、拖拽等操作,形成完整的自动化闭环。这一技术栈在软件测试、数据采集、重复性办公任务等领域具有重要价值,能够显著提升工作效率。开源项目openclaw-win正是这一理念的工程实践,它整合了图像识别与模拟操作模块,为开发者提供了一个研究自动化技术的具体样本。项目涉及模板匹配、坐标计算等关键技术点,并需处理屏幕适配、操作延迟等实际问

weixin_28745975的博客 326

Flutter开发之Dart必备基础知识

在本文中我们主要对标JavaScript来讲解Dart与JavaScript的异同,对JavaScript还不熟悉的小伙伴可以省略JavaScript部分,直接学习Flutter部分。 程序入口 JavaScript没有预定义的入口函数,但在Dart中,每个app都必须有一个顶级的main()函数作为应用程序的入口点。 // Dart main() { } 复制代码练一练 DartPad。 D...

weixin_34119545的博客 343

基于USB总线的虚拟摄像头(UVC)原理简介

前面文章中我们分析了虚拟声卡的实现,在文章中我们展示了创建一个虚拟麦克风和虚拟扬声器的技术原理。完成了音频的虚拟化之后,这里就要谈论一下对于视频的虚拟化了——虚拟摄像头的实现。关于虚拟麦克风和虚拟扬声器的实现,可以参考。虚拟摄像头应用也是非常普遍的,例如云桌面远程摄像头的实现,直播技术。目前对于虚拟摄像头有三种实现方式:DirectShow虚拟摄像头,这个是一种比较古老的技术;在新版本应用中,该项技术基本失效了,尤其是UWP框架程序,DirectShow虚拟摄像头就失效了。

tianxilink的博客 5415

Ubuntu 22.04源码编译安装ROS Noetic

Ubuntu 22.04源码编译安装ROS Noetic

Drknown的博客 2万+

dart的基础知识

一 变量和数据类型 1,定义变量的方法:var 变量名; var 变量名=**; 数据类型 变量名; 数据类型 变量名=***; 2,基本的数据类型: int:整数类型,(var a=1; or int a=1;)    double : 浮点类型,(var a=1.1; or doublea=1.1;) num:即可整数类...

weixin_30470857的博客 128

1.DJI-payload SDK负载开发准备和硬件连接及运行示例代码

大疆psdk开发环境

哒宰的博客 1442

Dart之基础知识学习

Flutter基础知识: Dart之方法 方法的定义 可选参数 默认参数值 方法对象 匿名方法 闭包 Dart之类对象的基础特性 类 属性 构造方法 对象的操作 Dart之类对象的高级特性 类的继承 抽象类 接口 Mixins 操作符的覆写 Flutter之方法 1,方法的定义 2,可选参数 Flutter可选参数就是在调用方法的时候,有些参数是可传可不传的。它有两种方式。 ...

蜗牛快跑 1169

蓝凌EIS智慧协同平台frm_form_upload.aspx接口存在任意文件上传漏洞

蓝凌EIS智慧协同平台frm_form_upload.aspx接口存在任意文件上传漏洞

nnn2188185的博客 357

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Dart 基础知识笔记

这里也为想要学习Flutter的朋友们准备了两份学习资料《Flutter Dart语言编程入门到精通》《Flutter实战》,从编程语言到项目实战,一条龙服务!!

bugyinyin的博客 332

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

flutter专栏--dart基础知识

本文介绍了Dart语言的变量声明和函数相关特性。在变量声明方面,详细说明了var、dynamic、Object、final和const的区别与使用场景,强调了类型推断和空安全机制。在函数部分,讲解了函数声明方法、作为变量传递、可选参数(位置参数和命名参数)等语法特性,特别指出Dart函数的返回值默认为dynamic类型而非推断类型。文章通过丰富的代码示例,展示了Dart语言在这些方面的灵活性和类型安全性,为开发者提供了清晰的语法指导。

qq_44742090的博客 890

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Dart之基础知识巩固

一、Dart中的变量与常量 1.变量 1.var类型是任意数据类型,一旦赋值类型就会确定不可以在更改,确定类型的时间是在编译结束以后 2.强制变量的类型比如String value = "今天是清明节"; 2、常量 不可变的变量例如一些配置项,对于不可变的变量可以使用final和const关键字,final修饰的关键字声明的变量为最终变量,const修饰的关键字为最终常量 final和const区别: const编译时常量,final是运行时常量(在第一次使用时被初始化),可以理解为’懒加载’ 类

可可的博客 2264

Dart基础知识之main()函数介绍

Dart基础知识之main()函数介绍 main()函数 main()函数,这是一种特殊的、必需的顶级函数,应用程序从这里开始执行(重要)!!! print()函数 显示输出,把内容显示在屏幕上 字符串拼接(插值) 包含一个变量或表达式的字符串等效于字符串字面量。 语法:$variableName或者${expression} 上面的示例是使用在线编辑器dartpad运行测试的. 在线编辑器地址:https://dartpad.cn/ ...

tw2496907023的博客 1042

(快速复习)Dart基础知识

一.Hello World 1.主函数 void main(List<String> args){ } 二.变量类型和数据类型

zhuangww05的博客 292

dart基础知识

常用数据类型: Numbers: int double Strings: String Booleans:bool List数组:

qwildwolf的博客 218

Dart学习笔记(一):基础知识与内置类型

目录一、Dart基础知识;二、重要概念:三、Dart中的关键字四、Dart变量五、Final 和 const修饰符六、内建类型Numbers(数值)1. int2. doublestrings(字符串)booleans(布尔值)lists (列表)mapsrunes (字符) 一、Dart基础知识; 新创建Flutter项目,Dart代码主要在 lib/main.dart文件中,由于本篇主要讲的...

yanerly的博客 721

【Dart】Dart基础知识(三) 同步异步问题 延迟执行

【Dart】Dart基础知识(三) 同步异步问题 延迟执行 Dart是一门单线程编程语言,所以异步IO+事件循环就显得尤为重要。但在一些业务逻辑上,我们需要手动规定执行顺序。

深耕 WebGIS 前端 / 数字孪生三维可视化✨ 2202
上一篇: Dart的数据类型
下一篇: 前端面试真题宝典(一)
MaxLoongLvs
博客等级 码龄9年 226粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaxLoongLvs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值