Flutter自定义插件开发示例dart_package_from_scratch_by_wago的使用
Flutter自定义插件开发示例dart_package_from_scratch_by_wago的使用
Dart Course
Content Overview
- 什么是Dart?
- 类型安全
- 声音类型系统
- 类型推断
- 非空安全
- Dart编译器
什么是Dart?
Dart是一种高度优化以提高性能并适应其生态系统编程语言。
Dart箭头代表Dart编程语言。
Dart玩家代表使用Dart的开发者。
Dart飞镖板代表基于Dart的应用程序生态系统。
为了让开发者(Dart玩家)构建成功的应用程序(击中靶心),Dart语言(Dart箭头)必须高度优化。这种优化确保开发者可以构建精确且高性能的应用程序,这些应用程序能很好地适应基于Dart的应用程序生态系统。
- 精度 – Dart的设计尽可能优化,确保在不同平台上具有高效率。
- 速度 – 如同飞镖一样,Dart是极简主义且快速执行,使其成为响应式应用程序的理想选择。
- 坚固性 – Dart的设计确保可扩展性、可维护性和可读性,使开发者能够为任何规模的项目编写清晰、有组织的代码。
- 可修改性 – Dart支持热重载,允许快速开发并在代码更改时立即获得反馈。
- 流行框架 – Dart驱动Flutter,这是一个流行的框架,用于构建跨平台应用程序,为开发者提供了丰富的应用开发生态系统。
Dart的特性
类型安全
Dart是一种类型安全的语言,这意味着对数据的操作受到数据类型的约束,从而确保正确性并减少运行时错误。
示例:Dart中的类型安全
void main() {
int number = 42; // 一个int类型的变量
String text = "Hello"; // 一个String类型的变量
// 这段代码正常运行,因为操作符合类型要求
print(number + 10); // 输出: 52
// 下面这行代码会导致编译时错误,因为不能将int与String相加
// print(number + text); // 注释掉这行代码以避免类型错误
}
声音类型系统 | 类型检查
声音类型系统:
- 工具用于检查数据类型错误。
为什么叫声音?
- 声音指的是在计算机上输入数据时,分析器会检查其数据类型的声音。
- 静态分析器 - 在编译时检查数据类型。如果出现错误,则编译失败。它防止开发者编写错误的类型。
- 运行时类型检查 - 在运行时检查数据类型。如果出错,则抛出异常。这是双重检查。
动态类型
帮助开发者告诉静态分析器忽略或停止监听特定变量的数据类型。唯一检查将在运行时进行,使用类型推断。
void main() {
var number = 42; // 它会在编译时检查并转换类型。
}
类型推断
类型推断是什么?
类型推断是编程语言的一个特性,允许编译器或解释器根据分配给变量的值自动推断变量的类型。
dynamic vs var
var
var
不是一个类型,它只是告诉静态分析器通过类型推断静态地为变量分配类型。
dynamic
- 在Dart中,
dynamic
是一种独立的类型,允许变量存储任何类型的值,并且不强制在编译时进行静态类型检查。它使变量赋值更加灵活,可以存储整数、字符串、列表等。然而,这种灵活性是以类型安全性为代价的,只有在运行时才进行类型检查。声明为dynamic
的变量如果分配的值与预期操作不兼容,可能会导致运行时错误。
非空安全
声明非空安全
- 声明非空安全是编程语言的一项功能,例如Dart,它确保变量不能包含空值,除非显式允许。
桌面和移动设备上的JIT编译过程
-
通用前端(CFE):
- CFE 将Dart源代码转换为中间表示(IR),具体来说是内核抽象语法树,然后序列化为
.dill
文件。此文件格式包含Dart虚拟机(VM)所需的结构。
- CFE 将Dart源代码转换为中间表示(IR),具体来说是内核抽象语法树,然后序列化为
-
内核文件:
- 当加载
.dill
文件时,Dart VM 解析它以创建表示类和库的对象。每个实体保留对内核二进制文件的指针,以便在需要时访问原始数据。重要的是,在此过程中,仅反序列化实体的签名,这有助于通过最小化需要加载的数据量来提高性能。
- 当加载
-
JIT 编译:
- 当Dart应用程序运行时,JIT(即时编译器)从内核文件中提取实体并将其转换为中间语言(IL)。然后将此IL编译为非优化的机器代码以执行。
-
后续运行的优化:
- 对于同一实体的后续调用,JIT编译器利用从先前执行中收集的信息来优化中间语言。此优化过程通过生成优化后的机器代码来提高性能。
开发阶段
-
JIT(即时编译器):虚拟机的一部分。它只编译当前需要的代码量。如果重新运行代码且未更改,则使用已编译的代码;否则,仅在需要时重新编译代码更改。JIT编译器将源代码转换为中间语言/表示(IR),以便比机器代码更容易优化,这有助于加快开发周期。
- JIT 特性:
- 测试
- 调试
- 实时指标支持
- 快速开发周期
- 增量编译
- JIT 特性:
-
JIT 热重载:在应用程序运行时自动重新加载修改后的源代码。
生产阶段
-
AOT(提前编译器):将所有代码编译为机器代码以快速运行。
- 在此阶段用户不关心JIT功能。
Web上的编译过程
- 编译器将源代码转换为JavaScript。
开发阶段
- Dartdevc
生产阶段
- dart2js
Dart包
Dart包是什么?
- 是一个Dart项目。
文件结构
-
pubspec.yaml:将项目转换为包,并包含主要包配置和直接依赖项(您的包直接依赖的包及其版本)。
name: dart_package_from_scratch environment: sdk: ^3.4.4
-
pubspec.lock:包含所有包及其解析版本,包括直接依赖项和传递依赖项(您的直接依赖项所依赖的包)。
-
package_config.json:指定所有包的位置和配置,包括直接和传递依赖项以及您的包。
注意:只有包含
lib
文件的包才是有用的。
Dart包在其生命周期中的主要阶段
-
开发阶段:
- 关注开发者的体验。
-
生产阶段:
- 关注用户的体验。
Dart程序运行时经过的层次
-
虚拟机(VM):
- 由管理程序创建的一组软件组件,提供执行环境,指定管理程序如何与模拟的底层物理计算机组件交互。
-
Dart虚拟机(Dart VM):
- 一组辅助组件,帮助原生运行Dart代码并提供执行环境。
- 运行时系统 - 开发组件: * 调试 * 热重载 - JIT 和 AOT 编译器
注意:生产阶段的本机机器代码是在没有调试和热重载功能的精简版Dart虚拟机中运行的。
任何在虚拟机中的代码都在隔离环境中运行
-
隔离:完全独立的环境,用于运行代码,拥有自己的内存堆、自己的控制线程(称为突变线程)以及自己的辅助线程。
- 堆:由垃圾回收器管理的内存存储。 - 突变线程:Dart虚拟机中的一个组件,执行Dart代码并创建、存储、修改和删除内存堆中的对象。它在虚拟CPU的管理下运行,该CPU调度其执行并为其分配CPU资源。
更多关于Flutter自定义插件开发示例dart_package_from_scratch_by_wago的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter自定义插件开发示例dart_package_from_scratch_by_wago的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,自定义插件(或称为Dart包)是一种将特定功能封装成可重用的模块的方式。以下是一个简单的示例,展示如何从零开始创建一个Flutter自定义插件,并将其发布到pub.dev。我们将创建一个名为dart_package_from_scratch_by_wago
的插件。
1. 创建Dart包
首先,使用flutter
命令行工具创建一个新的Dart包:
flutter create --template=package dart_package_from_scratch_by_wago
这将创建一个名为dart_package_from_scratch_by_wago
的目录,其中包含一个基本的Dart包结构。
2. 实现插件功能
进入dart_package_from_scratch_by_wago
目录,并打开lib/dart_package_from_scratch_by_wago.dart
文件。在这里,我们将实现一个简单的功能,例如返回一个字符串。
// lib/dart_package_from_scratch_by_wago.dart
class DartPackageFromScratchByWago {
String getMessage() {
return "Hello from dart_package_from_scratch_by_wago!";
}
}
3. 添加依赖和文档
在pubspec.yaml
文件中,确保添加了必要的依赖项,并更新包的描述、版本等信息。
name: dart_package_from_scratch_by_wago
description: A simple Dart package example created from scratch by Wago.
version: 0.0.1
homepage: https://github.com/yourusername/dart_package_from_scratch_by_wago
environment:
sdk: ">=2.12.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
4. 编写测试
在test/dart_package_from_scratch_by_wago_test.dart
文件中,编写一个简单的测试来验证我们的功能。
// test/dart_package_from_scratch_by_wago_test.dart
import 'package:flutter_test/flutter_test.dart';
import 'package:dart_package_from_scratch_by_wago/dart_package_from_scratch_by_wago.dart';
void main() {
test('getMessage returns the correct message', () {
final package = DartPackageFromScratchByWago();
expect(package.getMessage(), "Hello from dart_package_from_scratch_by_wago!");
});
}
5. 运行测试
在终端中运行以下命令来运行测试:
flutter test
如果一切正常,测试应该通过。
6. 发布到pub.dev
在发布之前,确保你已经注册了pub.dev账户,并且已经登录。然后,运行以下命令来发布你的包:
flutter pub publish
按照提示操作,你的包将被发布到pub.dev。
7. 使用自定义插件
在你的Flutter项目中,你可以通过添加依赖来使用这个自定义插件。在pubspec.yaml
文件中添加:
dependencies:
dart_package_from_scratch_by_wago: ^0.0.1
然后运行flutter pub get
来获取依赖。
在你的Dart代码中,你可以这样使用它:
import 'package:dart_package_from_scratch_by_wago/dart_package_from_scratch_by_wago.dart';
void main() {
final package = DartPackageFromScratchByWago();
print(package.getMessage()); // 输出: Hello from dart_package_from_scratch_by_wago!
}