首页 > 其他分享 >Dart语言基础

Dart语言基础

时间:2024-05-31 16:34:35浏览次数:25  
标签:语言 name Point void 基础 Dart print 构造函数

简介

基于Dart语言,跨平台(移动端-Android-iOS/Web-各种浏览器/桌面-Windows-Mac/嵌入式平台-Linux-Fuchsia和高性能(GPU图形渲染技术)可达到120fps(胜任游戏)
flutter中文文档

Dart概述

Dart强类型的,面向对象的编程语言
运行方式一种是原生虚拟机,另一种是Dart转成js代码运行在浏览器
Dart与js对比,框架-生态-包管理命令
image
Dart官网 在线运行Dart代码
需要将Dart执行路径绑定在环境变量path上能够运行dart2js(转换js代码),pub(使用Dart生态相当于npm命令)等

Dart语法基础

image
运行dart helolo.dart,Dart去执行文件中的main()函数
///文档注释,通过dartdoc转成md文档
变量-Dart万物皆对象,变量存储的是对象的引用
数据类型-Number,String,List,Map等
类型转换API例如1.toString() 10.compareTo(12)数字比较 ''.isEmpty判断是否为空
数据类型List
image
Set无序的,元素唯一的集合,有求交集、并集,差集的操作,不能通过下标来取值
Map无序键值对,可以有判断key和Value是否存在的方法

  // 赋值
  // 如果 key 不存在,我们才赋值(如果key已经存在,则不赋值)
  p.putIfAbsent('gender', () => '男');
  p.putIfAbsent('gender', () => '女');

  // 获取 Map 中所有的 key
  print(p.keys);
  // 获取 Map 中所有的 value
  print(p.values);

  // 根据条件进行删除
  p.removeWhere((key, value) => key == 'gender');

其他数据类型
image

运算符

	## ~/ 地板除 向下取整
	## is is! 类型判断运算符,类似js中instanceof
	## null ?? 12 返回12,类似于js中||
	## obj?.length 避空运算符和js同
	## .. 级联运算符 原 s.add(1);s.add(2); 有后   s..add('a')..add('b') 返回运算符前对象的引用

函数

//js立即执行函数
(function() {
    // 这里的代码在函数定义后立即执行
    var localVar = 'This is a local variable';
})();
//Dart立即执行函数
  ((int n){
    print(n);
  }) (17);
 //js箭头函数
 var add = (a, b) => a + b;
 //Dart箭头函数
 int add(int a, int b) => a + b;

参数

位置参数

void greet(String name, int age) {
    print('Hello, $name! You are $age years old.');
}

greet('Alice', 30); // 位置参数按顺序匹配

命名参数

在参数前面加上 {}

点击查看代码

void greet({String name, int age}) {
    print('Hello, $name! You are $age years old.');
}

greet(name: 'Bob', age: 25); // 使用命名参数

可选位置参数

在参数前面加上 [] 来实现。可选位置参数可以有默认值。

点击查看代码
void greet(String name, [int age = 18]) {
    print('Hello, $name! You are $age years old.');
}

greet('Charlie'); // 使用默认值
greet('David', 35); // 提供参数值

剩余参数

使用 ... 来标记剩余参数。剩余参数必须是一个列表,并且只能有一个

点击查看代码
void greet(String name, int age, {String greeting, ...otherInfo}) {
    print('$greeting, $name! You are $age years old.');
    otherInfo.forEach((info) => print(info));
}

greet('Emma', 28, greeting: 'Hi', otherInfo: ['Nice to meet you.', 'Have a nice day.']);

作用域和闭包

Dart中闭包的实现方式和javaScript中完全一致
使用时机,既能重用变量,又能保护变量不被污染

异步函数

Dart中异步函数通过Future来实现,async函数返回一个Future,await用于等待Future

Future<int> fetchNumber() async {
    // 模拟异步操作
    await Future.delayed(Duration(seconds: 2));
    return 42;
}
//并行执行多个异步操作
void main() async {
    await Future.wait([
        fetchUserData(),
        fetchPosts(),
    ]);
    print('All async operations completed.');
}

类(包含属性和方法)是对象实例化的结果
构造函数是实例化时第一个被调用的函数,可在构造函数中写一些默认的操作
ES6和Dart中的类都支持构造函数,但在 Dart 中构造函数名称固定为类名,而在 ES6 中是 constructor。

class Point {
  num x, y;
  // 声明普通构造函数
  Point(this.x, this.y);
    // 命名构造函数
  Point.origin() {
    x = 0;
    y = 0;
  }

  // 命名构造函数
  Point.fromJson({x: 0, y: 0}) {
    this.x = x;
    this.y = y;
  }
}

void main() {
  var p = new Point(3, 4);
  print(p.y);
   // 默认坐标
  Point p1 = new Point.origin();
  // 手动设置坐标
  Point p2 = new Point.fromJson(x: 6, y: 6);
}
//命名构造函数(类名.函数名)实现多个构造函数,提供清晰度
//常量构造函数(当类生成的对象不会改变时)类中所有都是常量不可变,性能提高,属性必须通过final声明,常量构造函数必须通过const声明,可以省略new关键字,但声明不可变对象必须通过const关键字
class ImmutablePoint {
  // 属性必须通过 final 声明
  final num x;
  final num y;

  // 常量构造函数,必须通过 const 声明
  const ImmutablePoint(this.x, this.y);
}

void main() {
  // // 声明不可变对象,必须通过 const 关键字
  var p5 = const ImmutablePoint(1, 2);
  var p6 = const ImmutablePoint(1, 2);
  print(p5 == p6);//true
}
//工厂构造函数通过factory来声明,工厂函数不会自动生成实例,而是由代码来决定返回的实例
class Person {
  String name;
  static Person instance;
  // 工厂构造函数
  factory Person([String name = '刘备']) {
    // 工厂构造函数中,不能使用 this 关键字
    // print(this.name);
    if (Person.instance == null) {
      // 第一次实例化
      Person.instance = new Person.newSelf(name);
    }
    // 非第一次实例化
    return Person.instance;
  }
  // 命名构造函数
  Person.newSelf(this.name);
}

void main() {
  // 实例化操作
  Person p1 = new Person('关羽');
  Person p2 = new Person('张飞');
  print(p1 == p2);//true
}

受保护的成员在继承类这个可以访问,private成员只能在内部类中访问
Dart要想私有,方法或属性需以_开头,并且只有把类单独抽离成一个文件,私有属性和方法才能起作用
使用getter声明的方法,访问和声明时都不需要小括号,访问setter声明的方法时,也不需要小括号
初始化列表构造函数中参数设置默认值,且不需要给this的变量赋值,特殊用法重定向构造函数,构造函数的参数动态
image

class Point {
  double x, y, z;
  Point(this.x, this.y, this.z);
  // 初始化列表的特殊用法(重定向构造函数)
  Point.twoD(double x, double y) : this(x, y, 0);
}

void main() {
  var r = new Rect();
  // 实例化点
  var p = new Point(1,2,3);
  print(p.z);
  var p2 = new Point.twoD(4, 5);
  print(p2.z);
}

static
静态成员可以通过类名直接访问,不能通过实例化
静态方法不能使用this关键字,不能访问非静态的属性和方法
元数据
image
继承
子类extends继承父类,@override来覆写子类中与父类同样方法,super关键字在子类中来引用父类中属性和普通构造函数和命名构造函数Son(String job):super(job)
抽象类
模板,只能被继承,不能被实例化,继承的子类中必须实现抽象类的所有抽象方法,抽象方法是只有函数头没有函数体的方法,抽象类作为接口,继承的类需要实现所有的属性和方法
接口
接口可以是任意类,一般使用抽象类,implements 类可以实现多个接口,相当于组装零件
混入(Mixin)
Dart不同于C++只能继承单个类,普通类通过with来混入,提高代码复用的效率,后引入的混入会覆盖之前混入的内容,一旦被当做Mixin的类无法继承别的类只能继承Object类,也不能拥有构造函数
泛型
是在函数、类、接口中指定宽泛数据类型的语法,泛型函数、泛型类、泛型接口
使用泛型可以减少重复的代码,写一个函数代表多个不同数据类型的函数

// 泛型函数
 T getData<T>(T value) {
   return value;
 }

// 只约定参数类型,不约定函数返回值的类型
getData<T>(T value) {
  return value;
}

// 调用泛型函数
 print(getData<int>(20));
 
 // 泛型类
class GenericsClass<T> {
  Set s = new Set<T>();

  void add(T value) {
    this.s.add(value);
  }

  void info() {
    print(this.s);
  }
}

// 实例化泛型类
  GenericsClass g = new GenericsClass<int>();
  g.add(1);
  g.add(2);
  g.info();

泛型类型进一步做了限制

class Foo<T extends SomeBaseClass> {
  String toString() => "Instance of 'Foo<$T>'";
}

枚举
有限数量的常量
enum Color { red, green, blue} List<Color> colors = Color.values;

Dart库和生态

image

Dart中的库

自定义库
1.定义和导出库:在Dart中,可以使用 library 关键字定义一个库,并通过 export 导出公共API。

// lib/math.dart
library math;//小写字母加下划线

int add(int a, int b) {
  return a + b;
}
// main.dart 
import 'lib/math.dart';

void main() {
  print(add(2, 3)); // 输出: 5
}

系统库

引入方式import 'dart:库名称' dart:core库是被默认引入
部分引入

// show 后面指定包含引入的内容
import 'lib/common.dart' show f1, f3;
// hide 会隐藏后面的内容
import 'lib/common.dart' hide f1, f3;

命名冲突 用as关键字

import 'lib/common.dart';
import 'lib/function.dart' as func; // 给库添加前缀,解决命名冲突问题

void main() {
  f1();
  func.f1();
}

延迟加载库,需要用deferred as ,并没有真正加载,需要真正使用时调用loadLibrary函数

import 'lib/function.dart' deferred as func;

void main() {
  greet();
}

Future greet() async {
  await func.loadLibrary();
  func.hello();
}

通过part与part of来组装库,构建复杂库的时候使用
image
系统库列表
第三方库
image
pubspec.yaml详情

标签:语言,name,Point,void,基础,Dart,print,构造函数
From: https://www.cnblogs.com/zhixy/p/18219626

相关文章

  • R语言中绘制弧形箭头并添加文字
     001、测试01library(ggplot2)ggplot(data.frame(x=c(1,3),y=c(1,3)),aes(x=x,y=y))+geom_point()+geom_curve(aes(x=1.5,y=2.5,xend=2.6,yend=2.6),##绘制弧形箭头curvature=0.3,size=5,col="red",......
  • 使用LM Studio来运行本地版本大语言模型
     自2022年11月30日发布ChatGPT对话性大预言模型,AI再一次被推向了高潮,再到后来,国内外也衍生了大量的语言模型开放给公众使用。为了可以让更多人接触到AI,让本地化部署更加轻便快捷,于是就有了Ollama、LMStudio等可以在本地部署模型的工具。这两款工具相比较来说,个人觉的LMStudio......
  • B3663 [语言月赛202209] Luogu Academic
    [语言月赛202209]LuoguAcademic题目描述七海在LA群中游走,获得了一个由英文小写字符组成的字符串SSS。七海想要知道,子串luogu在其中出现了多少次。提示:一个字......
  • JAVA基础_面向对象
    类和对象        面向对象(ObjectOriented)是Java的编程范式,是一种对现实世界理解和抽象的方法。其中包括类、对象(实例)、属性、方法、等概念。类:类是一个模板,是一个抽象,它描述一类对象的行为和状态。对象:是类的一个实例,是具体的,有状态和行为。 属性:对象的状态称为......
  • Java基础之JVM
    一、Java中的内存管理1、程序,无论是代码还是数据,都需要存储在内存中。JVM为Java程序提供并管理所需要的内存空间2、JVM内存分为堆(heap)、栈(stock)、方法区(method)三个区域,分别用于储存不同的数据。3、HotSpot是SunJDK和OpenJDK中所带的虚拟机(SunJDK和OpenJDK除了注释,代码实现......
  • 2024年网络安全学习指南!详尽路线图,从零基础到黑客高手的进阶之路!
    零基础小白,到就业!入门到入土的网安/黑客学习路线!建议的学习顺序:一、网络安全学习普法(心里有个数,要进去坐几年!)1、了解并介绍《网络安全法》2、《全国人大常委会关于维护互联网安全的决定》3、《中华人民共和国计算机信息系统安全保护条例(2011年修正)》4、《中华人民共......
  • C语言(字符函数和字符串函数)1
                          Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~                           ......
  • 【C语言】动态内存管理
    前言为什么要有动态内存分配?可以回想一下目前为止,我们想要向内存申请一块空间存放数据,有哪些手段呢?目前我们遇到的方式主要有两种:一、创建一个变量。比如我们存放一个整型数据,就创建一个整型变量。(也就是申请4个字节)我们创建一个变量,存放了一个数据。intn=2077;二、如......
  • CentOS 7基础操作03_Linux命令的分类
    1、Linux命令的分类        Linux命令的执行必须依赖于Shell命令解释器。Shell实际上是在Linux操作系统中运行的一种特殊程序,它位于操作系统内核与用户之间,负责接收用户输入的命令并进行解释.将需要执行的操作传递给系统内核执行,Shell在用户和内核之间充当了“翻译官......
  • CentOS 7基础操作04_获得命令帮助
    1、使用help命令        help命令本身是LinuxShell中的一个内建指令,其用途是查看各Shell内部命令的帮助信息,使用help命令时只需要添加内部指令的名称作为参数即可,例如,执行"‘helppwd命令可以查看Shell内部命令pwd的帮助信息(pwd命令用于显示当前用户所在的工作......