针对flutter-usb包的一些坑

背景

我需要将包内容拆分在一个sdk中,通过调用自定义包中的usb库来使用usb插件;这时候,会出现一些问题;

关键词:拆包使用,电脑端usb,flutter,

问题

1. 无法初始化

使用quick_usb库中的

问题:

var init = await QuickUsb.init();无法进行,出现报错

flutter: LateInitializationError: Field '_instance@38265524' has not been initialized.

关于这个问题,比较重要,在网上看了,并没有合适的说法;针对性的问题解法,还是要自己解决源码;

 逐层修改,最后发现,如果不做拆包,sdk直接应用在应用中,在应用初始化运行的时候,会自然的对 QuickUsbPlatform _instance 进行初始化

 quick_usb> flutter run -d windows
Flutter assets will be downloaded from      
https://storage.flutter-io.cn. Make sure you
trust this source!
Launching lib\main.dart on Windows in debug
mode...
Building Windows application...
flutter: >>>>>>>>>>object
flutter: QuickUsbPlatform  Instance of 'QuickUsbMacos'       
Syncing files to device Windows... // 表示正在将文件同步到 Windows 设备上
      174ms

运行这个过程包括以下几个步骤:

  1. 启动Flutter应用程序:Flutter框架会加载应用程序的入口点(通常是 main.dart 文件),开始执行应用程序的代码。

  2. 构建Windows应用程序:根据 Flutter 应用程序的代码和配置,使用 Flutter 自身的编译工具,生成 Windows 应用程序所需的文件和资源。这个过程会根据你的项目配置(如 pubspec.yaml 中的设置)进行构建,并生成一个 Windows 应用程序的可执行文件。

  3. 同步文件到 Windows 设备:在构建完成后,Flutter 工具会将生成的文件和资源同步到连接到电脑的 Windows 设备上。这个过程确保 Windows 设备上的应用程序文件与本地代码保持同步,以便在运行时能够正确显示和执行应用程序的逻辑。

也就是说,在构建windows application中,根据项目配置,进行了对应的构造;

补充:应该是平台的某种设定问题,不太确定如何解决;还可以借鉴ble库的两种方式

在 Flutter 中,`PlatformInterface` 是一个用于定义平台相关功能的接口的机制。它提供了一种跨平台和类型安全的方式,使开发者能够编写与特定平台相关的代码,并确保它们能够在不同平台上正常运行。

`PathProviderPlatform` 是 `path_provider` 插件中使用的一个具体的 `PlatformInterface`。它定义了一组方法,用于获取设备文件路径的信息,如临时文件目录、文档目录等。`PathProviderPlatform` 的目的是为了在不同平台上提供统一的接口,以确保开发者能够方便地获取文件路径,而无需关心具体的平台实现。

使用 `PlatformInterface` 和 `PathProviderPlatform` 的典型用法如下:

1. 定义平台接口:创建一个继承自 `PlatformInterface` 的抽象类,例如 `PathProviderPlatform`。在这个接口类中定义一组抽象方法,表示不同平台上获取文件路径的功能。

2. 创建平台实现:在针对不同平台的插件中,实现 `PathProviderPlatform` 接口。例如,创建一个名为 `PathProviderMacOS` 的类实现 macOS 平台上的获取文件路径方法,创建另一个名为 `PathProviderAndroid` 的类实现 Android 平台上的获取文件路径方法。

3. 注册平台实现:在插件的注册过程中,使用 `PathProviderPlatform` 的注册方法 `PathProviderPlatform.instance.registerLibrary` 将平台实现注册到 `PathProviderPlatform`。

4. 使用路径提供者:在应用程序中,通过 `PathProviderPlatform.instance` 来获取 `PathProviderPlatform` 的实例,并调用其中的方法来获得所需的文件路径信息。由于 `PathProviderPlatform` 的实例是根据当前平台自动选择的,开发者无需手动处理平台差异。

关于初始化失败的问题,如果使用 `PlatformInterface` 和 `PathProviderPlatform` 时遇到初始化失败,可能有以下几个原因:

1. 缺少平台实现:确保你为每个目标平台都提供了相应的 `PathProviderPlatform` 实现。如果某个平台没有实现,那么在运行时就无法找到相应的实现,导致初始化失败。

2. 注册顺序问题:在注册平台实现时,确保先注册你的平台实现,然后再注册 `PathProviderPlatform`。注册顺序错误可能会导致平台实现无法正确地与 `PathProviderPlatform` 绑定。

3. 版本冲突:在 Flutter 中,`PlatformInterface` 机制要求使用相同的包名、类名和函数签名来定义接口和实现类。如果接口和实现类的定义不一致,或者使用了不兼容的版本,可能会导致初始化失败。

记住,Flutter的 `PlatformInterface` 和 `PathProviderPlatform` 机制旨在简化跨平台开发并提供一致的接口。如果按照上述用法进行了正确的实现和注册,通常不会遇到初始化失败的问题。如果需要更具体的帮助,请提供更多与你当前问题相关的上下文信息。

以上算是无关紧要的问题查询,以下为问题核心代码:

abstract class SmartUsbPlatform extends PlatformInterface {
  SmartUsbPlatform() : super(token: _token);

  static final Object _token = Object();

  static late SmartUsbPlatform _instance;

  /// The default instance of [PathProviderPlatform] to use.
  ///
  /// Defaults to [MethodChannelPathProvider].
  static SmartUsbPlatform get instance => _instance;

  /// Platform-specific plugins should set this with their own platform-specific
  /// class that extends [PathProviderPlatform] when they register themselves.
  static set instance(SmartUsbPlatform instance) {
    PlatformInterface.verifyToken(instance, _token);
    _instance = instance;
  }

 观察windows文件中的flutter/ephemeral路径下的内容;

会有generated_plugin_registriar文件

2. 更换库,出现cmakelist.txt文件中无法找到cpp文件

使用 SmartUsb库后,在应该出现的文档中,找到报错位置的文档,会发现没有出现应当出现的文档:smart_usb_plugin.cpp文件

换回quick_usb库,无此问题,具体没再追究细节;

猜你喜欢

转载自blog.csdn.net/m0_73016265/article/details/132224467