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编译过程

  1. 通用前端(CFE)

    • CFE 将Dart源代码转换为中间表示(IR),具体来说是内核抽象语法树,然后序列化为 .dill 文件。此文件格式包含Dart虚拟机(VM)所需的结构。
  2. 内核文件

    • 当加载 .dill 文件时,Dart VM 解析它以创建表示类和库的对象。每个实体保留对内核二进制文件的指针,以便在需要时访问原始数据。重要的是,在此过程中,仅反序列化实体的签名,这有助于通过最小化需要加载的数据量来提高性能。
  3. JIT 编译

    • 当Dart应用程序运行时,JIT(即时编译器)从内核文件中提取实体并将其转换为中间语言(IL)。然后将此IL编译为非优化的机器代码以执行。
  4. 后续运行的优化

    • 对于同一实体的后续调用,JIT编译器利用从先前执行中收集的信息来优化中间语言。此优化过程通过生成优化后的机器代码来提高性能。

开发阶段

  • JIT(即时编译器):虚拟机的一部分。它只编译当前需要的代码量。如果重新运行代码且未更改,则使用已编译的代码;否则,仅在需要时重新编译代码更改。JIT编译器将源代码转换为中间语言/表示(IR),以便比机器代码更容易优化,这有助于加快开发周期。

    • 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

1 回复

更多关于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!
}
回到顶部