flutter基础 --dart语法学习

由于想要写一款性能较好,但是又可以一套代码多个平台运行的客户端app,所以选择了flutter 就去看了官方文档,大体发现flutter使用的dart语言和java和js差不多,感觉就是缝合怪。

Dart 是一种面向对象的编程语言,语法上与 Java、JavaScript 等语言有一些相似之处,因此对于有 Java 基础的开发者,Dart 的语法应该相对容易理解。以下是 Dart 语言的语法介绍,特别对比了与 Java 的异同。

看完由遗忘很正常 ,必要时可以查看官方中文文档

https://dart.cn/language/

1. 基本语法

1.1 变量声明

Dart 是强类型语言,但可以通过 var 来声明类型推断的变量。

  • Dart
int age = 30;  // 明确类型
var name = 'John';  // 自动推断为 String
  • Java
int age = 30;  // 明确类型
String name = "John";  // 明确类型

Dart 中 var 类似于 Java 的局部类型推断 var(自 Java 10 引入)。

1.2 常量

Dart 中使用 constfinal 来声明常量。const 是编译时常量,而 final 是运行时常量,赋值后不能修改。

  • Dart
const double pi = 3.14;  // 编译时常量
final currentTime = DateTime.now();  // 运行时常量
  • Java

final double PI = 3.14;  // Java 没有 const,但 final 可以限制变量不可修改

如果不显示定义 编译时会自动推断

  var b="奥萨苏";
1.3 函数定义

Dart 中的函数定义与 Java 类似,但 Dart 的函数可以是顶级函数,不需要类的包装。

  • Dart
int add(int a, int b) {return a + b;
}// 简写方式(箭头函数)
int subtract(int a, int b) => a - b;
  • Java
public int add(int a, int b) {return a + b;
}

Dart 的函数可以直接返回表达式,使用 => 箭头函数表示法。

如果不显示定义返回值 则是dynamic类型

void main() {int a=12 ;print('你好世界');print(a++);String name ="jack";print("开发者的名字是=$name"); //输出的时候的引用// 双引号嵌套单引号// 单引号嵌套双引号print("他就是世界第一的'火影大王'");print('他就是世界第一的"火影大王"');var b="奥萨苏";print(b);add(1,2);}
add (int a,int b){return a+b;
}

2. 控制流

2.1 条件语句

Dart 的 if-else 语法与 Java 完全一致。

  • Dart
if (age > 18) {print('Adult');
} else {print('Minor');
}
  • Java
if (age > 18) {System.out.println("Adult");
} else {System.out.println("Minor");
}
2.2 循环

Dart 的循环控制结构与 Java 非常相似,forwhiledo-while 循环的语法基本一致。

  • Dart
for (int i = 0; i < 5; i++) {print(i);
}int i = 0;
while (i < 5) {print(i);i++;
}
  • Java
for (int i = 0; i < 5; i++) {System.out.println(i);
}int i = 0;
while (i < 5) {System.out.println(i);i++;
}
2.3 switch-case

Dart 的 switch-case 语法与 Java 类似,但 case 不需要 break,也没有 fall-through 行为。

  • Dart
var grade = 'A';switch (grade) {case 'A':print('Excellent');break;case 'B':print('Good');break;default:print('Unknown grade');
}
  • Java
char grade = 'A';switch (grade) {case 'A':System.out.println("Excellent");break;case 'B':System.out.println("Good");break;default:System.out.println("Unknown grade");
}

3. 面向对象编程

3.1 类和对象

Dart 是面向对象语言,所有东西都是对象,类的定义方式与 Java 类似。

  • Dart
class Person {String name;int age;// 构造函数Person(this.name, this.age);void greet() {print('Hello, my name is $name');}
}void main() {var person = Person('Alice', 30);person.greet();
}
  • Java
class Person {String name;int age;// 构造函数public Person(String name, int age) {this.name = name;this.age = age;}public void greet() {System.out.println("Hello, my name is " + name);}
}public static void main(String[] args) {Person person = new Person("Alice", 30);person.greet();
}
3.2 继承

Dart 支持单继承,使用 extends 关键字。

  • Dart
class Employee extends Person {String jobTitle;Employee(String name, int age, this.jobTitle) : super(name, age);@overridevoid greet() {print('Hello, I am $name, and I work as a $jobTitle');}
}
  • Java
class Employee extends Person {String jobTitle;public Employee(String name, int age, String jobTitle) {super(name, age);this.jobTitle = jobTitle;}@Overridepublic void greet() {System.out.println("Hello, I am " + name + ", and I work as a " + jobTitle);}
}
3.3 接口和抽象类

Dart 没有显式的 interface 关键字,但所有类都可以作为接口被实现。使用 abstract 关键字定义抽象类。

  • Dart
abstract class Animal {void sound();  // 抽象方法
}
//作为接口被实现class Dog implements Animal{@overridevoid sound() {print('Woof');}
}//但是接口没有有办法在父类申明数值
abstract class Animal {late String name;Animal(this.name); // 抽象方法void sound();}
//使用implents 就会报错
class Dog extends Animal{Dog(String name):super(name);  @overridevoid sound() {print('Woof');}}
  • Java
abstract class Animal {abstract void sound();
}class Dog extends Animal {@Overridevoid sound() {System.out.println("Woof");}
}

演示代码

这里dart 利用的是重写来实现继承和实现的逻辑

class Person {String name;int age;// 构造函数Person(this.name, this.age);void greet() {print('Hello, my name is $name');}
}void main() {// 多态 父类对象 申明位子类对象Person person = Employee('网名', 30,"日报记者");person.greet();Iservice service=ServiceImple("jack");service.sayhello();
}
class Employee extends Person {String jobTitle;//调用父类的构造函数 和本类的构造函数Employee(String name, int age, this.jobTitle) : super(name, age);@overridevoid greet() {print('Hello, I am $name, and I work as a $jobTitle');}
}abstract class Iservice {late String name; // 抽象类中的变量Iservice(this.name);void sayhello(){print("接口说你好");}int Add(int a, int b);
}class ServiceImple extends Iservice {ServiceImple(String name):super(name);/*** 实现父类空方法*/@overrideint Add(int a, int b) {return a + b; // 实现加法}/*** 对父类重写 增强*/@overridevoid sayhello() {super.sayhello();print('Hello, my name is $name'); // 使用 name}
}

4. 异步编程

4.1 异步函数

Dart 有内置的 asyncawait 关键字,用于处理异步编程,这与 JavaScript 中的异步编程类似。

  • Dart

    感觉跟js的很想

Future<void> fetchData() async {var data = await fetchFromServer();print(data);
}Future<String> fetchFromServer() {// 模拟从服务器获取数据 俩秒后返回数据return Future.delayed(Duration(seconds: 2), () => 'Server data');
}
//冒泡排序
main() {fetchData();
}
  • Java 中没有 asyncawait,你可以通过 CompletableFuture 或其他异步库实现异步操作:
import java.util.concurrent.CompletableFuture;public class AsyncExample {public static void main(String[] args) {fetchData();}public static void fetchData() {CompletableFuture.supplyAsync(() -> fetchFromServer()).thenAccept(data -> System.out.println(data));}public static String fetchFromServer() {try {Thread.sleep(2000);  // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}return "Server data";}
}
4.2 Stream

Dart 中的 Stream 类似于 Java 的 Stream,但它更侧重于处理异步事件流。

  • Dart
Stream<int> countStream(int to) async* {for (int i = 1; i <= to; i++) {yield i;}
}void main() async {await for (var value in countStream(5)) {print(value);  // 依次输出 1 到 5}
}
  • Java 中的 Stream 主要用于集合的函数式操作,而异步流处理可以使用 RxJavaProject Reactor

5. 其他重要特性

5.1 集合操作

Dart 中的集合与 Java 类似,包括 ListSetMap 等。

api和java差不多

  • Dart
List<int> numbers = [1, 2, 3];
Map<String, int> ages = {'Alice': 30, 'Bob': 25};numbers.forEach(print);
  • Java
List<Integer> numbers = Arrays.asList(1, 2, 3);
Map<String, Integer> ages = new HashMap<>();
ages.put("Alice", 30);
ages.put("Bob", 25);numbers.forEach(System.out::println);

Dart 语言中的集合操作非常丰富,类似于 Java 的集合框架,但也有其独特之处。Dart 提供了常用的集合类型(如 ListSetMap),并提供了大量的 API 来操作集合。以下是 Dart 集合操作和 API 的详解:

1. List(列表)

List 是 Dart 中的可变数组,类似于 Java 中的 ArrayList。它可以存储有序的元素,并且允许重复元素。

创建列表

  • 空列表

    var list = <int>[];  // 创建空的整数列表
    
  • 带初始值的列表

    var list = [1, 2, 3, 4];  // 初始化列表
    
  • 不可变列表

    var fixedList = List.unmodifiable([1, 2, 3]);  // 创建不可修改的列表
    

常用 API

  • 添加元素

    list.add(5);  // 添加单个元素
    list.addAll([6, 7]);  // 添加多个元素
    
  • 插入元素

    list.insert(0, 0);  // 在索引 0 处插入 0
    list.insertAll(1, [8, 9]);  // 在索引 1 处插入多个元素
    
  • 删除元素

    list.remove(1);  // 删除第一个值为 1 的元素
    list.removeAt(0);  // 删除索引为 0 的元素
    list.removeWhere((item) => item % 2 == 0);  // 删除所有符合条件的元素
    
  • 查找元素

    var containsTwo = list.contains(2);  // 检查列表是否包含某个元素
    var indexOfThree = list.indexOf(3);  // 查找元素的位置
    
  • 排序

    list.sort();  // 升序排序
    list.sort((a, b) => b.compareTo(a));  // 降序排序
    
  • 遍历

    list.forEach((item) => print(item));  // 遍历列表并打印每个元素
    
  • 映射和过滤

    var squaredList = list.map((item) => item * item).toList();  // 对每个元素平方并返回新列表
    var evenList = list.where((item) => item.isEven).toList();  // 筛选偶数
    
  • 其他常用操作

    list.clear();  // 清空列表
    var isEmpty = list.isEmpty;  // 检查是否为空
    var length = list.length;  // 获取长度
    
2. Set(集合)

Set 是一个无序且元素唯一的集合,类似于 Java 的 HashSet

创建集合
  • 空集合

    var set = <int>{};  // 创建空的整数集合
    
  • 带初始值的集合

    
    var set = {1, 2, 3, 4};  // 初始化集合
    
常用 API
  • 添加元素

    set.add(5);  // 添加单个元素
    set.addAll([6, 7]);  // 添加多个元素
    
  • 删除元素

    set.remove(1);  // 删除元素 1
    set.removeWhere((item) => item.isEven);  // 删除符合条件的元素
    
  • 集合操作

    var unionSet = set.union({5, 6});  // 并集
    var intersectionSet = set.intersection({3, 4, 5});  // 交集
    var differenceSet = set.difference({3, 4});  // 差集
    
  • 遍历

    
    set.forEach((item) => print(item));  // 遍历集合
    
  • 其他常用操作

    var containsThree = set.contains(3);  // 检查集合是否包含某个元素
    var isEmpty = set.isEmpty;  // 检查是否为空
    var length = set.length;  // 获取长度
    

3. Map(映射)

Map 是键值对的集合,类似于 Java 的 HashMap。键必须是唯一的,值可以重复。

创建映射
  • 空映射

    var map = <String, int>{};  // 创建空的键值对映射
    
  • 带初始值的映射

    var map = {'one': 1, 'two': 2};  // 初始化映射
    
常用 API
  • 添加或更新键值对

    map['three'] = 3;  // 添加新键值对
    map.update('two', (value) => value + 2);  // 更新键 'two' 的值
    
  • 删除键值对

    map.remove('one');  // 删除键 'one' 对应的键值对
    
  • 查找值

    var value = map['two'];  // 根据键获取值
    var containsKey = map.containsKey('two');  // 检查是否包含某个键
    var containsValue = map.containsValue(2);  // 检查是否包含某个值
    
  • 遍历

    
    map.forEach((key, value) => print('$key: $value'));  // 遍历映射
    
  • 获取键或值的集合

    var keys = map.keys;  // 获取所有键
    var values = map.values;  // 获取所有值
    
  • 其他常用操作

    var isEmpty = map.isEmpty;  // 检查是否为空
    var length = map.length;  // 获取长度
    
5.2 异常处理

Dart 的异常处理与 Java 类似,使用 try-catch

  • Dart
try {var result = 10 ~/ 0;  // 整数除法会抛出异常
} catch (e) {print('Caught an exception: $e');
} finally {print('This will always execute');
}
  • Java
try {int result = 10 / 0;
} catch (ArithmeticException e) {System.out.println("Caught an exception: " + e);
} finally {System.out.println("This will always execute");
}
5.3 空安全

Dart 支持空安全(null-safety),防止 null 引发错误,类似于 Java 的 Optional。

  • Dart
String? name;  // 允许为 null
name = null;
print(name?.length);  // 使用 ?. 操作符避免空指针异常
  • Java
Optional<String> name = Optional.ofNullable(null);
System.out.println(name.map(String::length).orElse(0));

枚举

dart 的枚举也和java类似

dart 需要强制编译时就申明构造函数不可变

enum HttpStatus {ok(200, "响应成功"),created(201, "创建成功"),badRequest(400, "请求错误"),unauthorized(401, "未授权"),notFound(404, "未找到"),internalServerError(500, "服务器内部错误");final int code;final String name;
//一申明即不可变const HttpStatus(this.code, this.name);
}

java

public enum Test {ok(200, "OK");final int code;final String message;Test(int code, String message) {this.code = code;this.message = message;}
}

补充

下面的内容都是用到啥 补充啥

初始化

构造函数后面跟 :代码块即可执行初始化 在构造函数之前执行

还有之前的构造函数调用父类方式本质也只是这种初始化的缩写

class Animal{String name;int age;Animal(this.name,this.age);
}
class Person extends Animal{String action;Person(String name,int age,this.action):super(name,age){print("构造函数被调用");super.age=age;super.name=name;}
}

可变参数搭配可空操作

void greet(String name, {String? greeting, String? farewell}) {if (greeting != null) {print('$greeting, $name!');} else {print('Hello, $name!');}if (farewell != null) {print('$farewell, $name!');}
}void main() {greet('Alice');                                // 输出: Hello, Alice!greet('Bob', greeting: 'Hi');                  // 输出: Hi, Bob!greet('Charlie', farewell: 'Goodbye');         // 输出: Hello, Charlie! Goodbye, Charlie!greet('David', greeting: 'Hey', farewell: 'See you');  // 输出: Hey, David! See you, David!
}

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

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

相关文章

Docker工作目录迁移

文章目录 前言一、迁移步骤1.停掉docker服务2.创建存储目录3.迁移docker数据4.备份5.添加软链接6.重启docker服务&#xff0c;测试 总结 前言 安装docker&#xff0c;默认的情况容器的默认存储路径会存储系统盘的 /var/lib/docker 目录下&#xff0c;系统盘一般默认 50G&#…

深入解析网络七层模型:从基础到实践

在网络通信的世界中&#xff0c;OSI七层模型&#xff08;Open Systems Interconnection Model&#xff09;是理解计算机网络结构和通信过程的基础框架。无论你是网络新手还是资深技术人员&#xff0c;理解这一模型对分析和解决网络问题至关重要。在这篇博客中&#xff0c;我们将…

怎么让Nginx可以访问某一IP的每个后台controller接口

http { upstream backend { server 192.168.1.10; # 后端服务器IP } server { listen 80; location /controller1/ { ##proxy_pass http://localhost:801; proxy_pass http://backend/controller1/; # 后端controller1…

ArcGIS Pro SDK (十四)地图探索 6 图形与工具

ArcGIS Pro SDK (十四)地图探索 6 图形与工具 文章目录 ArcGIS Pro SDK (十四)地图探索 6 图形与工具1 图形叠加1.1 图形叠加1.2 图形叠加与 CIMPicture图形1.3 添加带有文本的叠加图形2 工具2.1 更改草图工具的符号2.2 创建用于地图中单击的点的返回坐标的工具2.3 创建用于…

JetsonNano、Ubuntu开机自启动脚本编写(一遍过)

本文章的开机自启动脚本结合.service文件和gnome工具来实现。 需要实现的功能大概是&#xff1a;初始化&#xff08;给端口权限&#xff09;板卡与下位机&#xff08;STM32&#xff09;相连的串口&#xff0c;然后运行相关的python代码。 参考文章&#xff1a; Jetson nano开机…

https的连接过程

根证书: 内置在操作系统和浏览器中,可手动添加,下级是中间证书或服务器证书,只有当中间证书或服务器证书关联到已存在的根证书时,中间证书或服务器证书才视为有效 中间证书: 位于根证书和服务器证书之间,他们之间也可以没有中间证书,作用是对根证书增加一个下级,方便管理,由根…

整合多方大佬博客以及视频 一文读懂 servlet

参考文章以及视频 文章&#xff1a; 都2023年了&#xff0c;Servlet还有必要学习吗&#xff1f;一文带你快速了解Servlet_servlet用得多吗-CSDN博客 【计算机网络】HTTP 协议详解_3.简述浏览器请求一个网址的过程中用到的网络协议,以及协议的用途(写关键点即可)-CSDN博客 【…

yolov8旋转目标检测之绝缘子检测-从数据加载到模型训练、部署

YOLOv8 是 YOLO (You Only Look Once) 系列目标检测算法的最新版本&#xff0c;以其高速度和高精度而著称。在电力行业中&#xff0c;绝缘子是电力传输线路上的重要组件之一&#xff0c;它们用于支撑导线并保持电气绝缘。由于长期暴露在户外环境中&#xff0c;绝缘子容易出现损…

SpinalHDL之结构(三)

本文作为SpinalHDL学习笔记第六十三篇&#xff0c;介绍SpinalHDL的函数(Function)。 目录&#xff1a; 1.简介(Introduction) 2.RGA到灰度(RGB to grey) 3.Valid和Ready负载总线(Valid Ready Payload bus) ⼀、简介(Introduction) ⽤Scala函数产⽣硬件的⽅式与VHDL/Verilog…

【JavaEE】多线程编程引入——认识Thread类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能帮到你&#xff01; 目录 引入&#xff1a; 一&#xff1a;Thread类 1&#xff1a;Thread类可以直接调用 2&#xff1a;run方法 &a…

【25.6】C++智能交友系统

常见错误总结 const-1 如下代码会报错 原因如下&#xff1a; man是一个const修饰的对象&#xff0c;即man不能修改任何内容&#xff0c;但是man所调用的play函数只是一个普通的函数&#xff0c;所以出现了报错。我们需要在play函数中加上const修饰&#xff0c;或者删除man对…

创建一个Java项目在IntelliJ IDEA中

创建一个Java项目在IntelliJ IDEA中是一个直观且功能强大的过程&#xff0c;适合从初学者到经验丰富的开发者。IntelliJ IDEA由JetBrains开发&#xff0c;被誉为Java开发领域最受欢迎的IDE&#xff08;集成开发环境&#xff09;之一&#xff0c;它提供了代码自动补全、版本控制…

【计算机网络 - 基础问题】每日 3 题(十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

SpringBoot环境配置(Spring Boot Profile)

一、介绍 在Spring Boot中&#xff0c;spring.profiles 配置用于定义不同环境下的配置文件。这使得应用可以在不同的环境中使用不同的配置&#xff0c;比如开发环境、测试环境和生产环境等。这种方式可以避免在代码中硬编码配置信息&#xff0c;并且能够更灵活地管理应用的环境…

SpringBootWeb增删改查入门案例

前言 为了快速入门一个SpringBootWeb项目&#xff0c;这里就将基础的增删改查的案例进行总结&#xff0c;作为对SpringBootMybatis的基础用法的一个巩固。 准备工作 需求说明 对员工表进行增删改查操作环境搭建 准备数据表 -- 员工管理(带约束) create table emp (id int …

计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

选题背景‌&#xff1a; 随着城市化进程的加快&#xff0c;公共交通成为城市居民出行的重要方式。然而&#xff0c;传统的公交站点线路查询方式往往依赖于纸质地图或简单的电子显示屏&#xff0c;查询效率低下且信息更新不及时。因此&#xff0c;开发一个功能全面、易于使用的…

OpenMV学习第一步安装IDE_2024.09.20

用360浏览器访问星瞳科技官网&#xff0c;一直提示访问不了。后面换了IE浏览器就可以访问。第一个坑。

互联网技术的持续演进:从现在到未来

互联网技术的持续演进&#xff1a;从现在到未来 在过去的十年里&#xff0c;互联网技术发生了飞速变化。无论是大数据、人工智能&#xff0c;还是5G网络和物联网&#xff0c;每一种技术的突破都在改变我们的生活方式和工作模式。作为现代社会的核心驱动力&#xff0c;互联网技…

Qwen2-VL的微调及量化

一、Qwen2-VL简介 Qwen2-VL是Qwen-VL的升级版本&#xff0c;能力更强&#xff0c;性能全面提升。尤其是72B参数的版本更是取了惊人的成绩。它可以读懂不同分辨率和不同长宽比的图片&#xff0c;在 MathVista、DocVQA、RealWorldQA、MTVQA 等基准测试创下全球领先的表现&#xf…

基于springboot的智慧社区微信小程序

文未可获取一份本项目的java源码和数据库参考。 本课题研究目标 本文主要对小区生活服务平台的功能和非功能需求进行了分析&#xff0c;系统除了提供物业保修、小区资讯、投诉留言、常用电话等基础功能外&#xff0c;为了满足用户的多样化需求&#xff0c;还提供邻里圈子和有…