Flutter & Dart问题记录 - Package类型项目的平台支持

文章目录

  • 前言
  • 开发环境
  • 问题描述
  • 问题分析
  • 解决方案
  • 总结
  • 最后


前言

在Flutter问题记录 - Flutter插件创建Package项目报错:At least one platform must be selected文章中初步确定Flutter创建Package项目选择支持的平台是无效的,但同时在Pub仓库又能看到一些Package类型的库显示只支持部分平台,带着这个疑问我写下了这篇文章。

开发环境

  • Android Studio: 2021.3.1 Patch 1
  • Flutter: 3.3.10
  • Dart 2.18.6

问题描述

创建Flutter Package项目时无法选择平台,奇怪的是在Pub仓库又能看到一些Package类型的库显示只支持部分平台,再者如果确实有这样的需求,该怎么设置只支持部分平台呢?

Pub仓库中两个显示只支持部分平台的示例:

示例一:mason

Flutter & Dart问题记录 - Package类型项目的平台支持_第1张图片

示例二:build_runner

Flutter & Dart问题记录 - Package类型项目的平台支持_第2张图片

问题分析

  1. 示例一分析

查看pubspec.yaml文件,可以看到里面并没有平台相关的声明,那为什么会不支持Web平台呢?

name: mason
description: >
  A Dart template generator which helps teams generate files quickly and consistently.
version: 0.1.0-dev.40
homepage: https://github.com/felangel/mason
repository: https://github.com/felangel/mason
issue_tracker: https://github.com/felangel/mason/issues
documentation: https://github.com/felangel/mason/tree/master/packages/mason_cli#readme

environment:
  sdk: ">=2.16.0 <3.0.0"

dependencies:
  archive: ^3.1.11
  checked_yaml: ^2.0.1
  collection: ^1.15.0
  convert: ^3.1.0
  crypto: ^3.0.1
  http: ^0.13.3
  json_annotation: ^4.4.0
  mason_logger: ^0.2.2
  meta: ^1.7.0
  mustache_template: ^2.0.0
  path: ^1.8.0
  pool: ^1.5.1
  pub_semver: ^2.1.0
  recase: ^4.0.0
  yaml: ^3.1.0

dev_dependencies:
  build_runner: ^2.0.0
  build_verify: ^3.0.0
  build_version: ^2.0.0
  json_serializable: ^6.0.0
  mocktail: ^0.3.0
  test: ^1.17.0
  very_good_analysis: ^2.4.0 

点开这个库在Pub仓库里的Scores,找到Platform support,点开查看详情:

Flutter & Dart问题记录 - Package类型项目的平台支持_第3张图片

可以看到Package不兼容Web平台的原因是使用了dart:iodart:io库不支持Web平台,依赖dart:io库的Package自然被Pub当作不支持Web平台。

  1. 示例二分析

查看pubspec.yaml文件,可以看到里面有关于平台的声明platforms

name: build_runner
version: 2.3.4-dev
description: A build system for Dart code generation and modular compilation.
repository: https://github.com/dart-lang/build/tree/master/build_runner

environment:
  sdk: ">=2.14.0 <3.0.0"

platforms:
  linux:
  windows:
  macos:

dependencies:
  args: ^2.0.0
  async: ^2.5.0
  analyzer: '>=4.4.0 <6.0.0'
  build: ">=2.1.0 <2.4.0"
  build_config: ">=1.1.0 <1.2.0"
  build_daemon: ^3.1.0
  build_resolvers: ^2.0.0
  build_runner_core: ^7.2.0
  code_builder: ^4.2.0
  collection: ^1.15.0
  crypto: ^3.0.0
  dart_style: ^2.0.0
  frontend_server_client: ^3.0.0
  glob: ^2.0.0
  graphs: ^2.0.0
  http_multi_server: ^3.0.0
  io: ^1.0.0
  js: ^0.6.3
  logging: ^1.0.0
  meta: ^1.3.0
  mime: ^1.0.0
  package_config: ^2.0.0
  path: ^1.8.0
  pool: ^1.5.0
  pub_semver: ^2.0.0
  pubspec_parse: ^1.0.0
  shelf: ^1.0.0
  shelf_web_socket: ^1.0.0
  stack_trace: ^1.10.0
  stream_transform: ^2.0.0
  timing: ^1.0.0
  watcher: ^1.0.0
  web_socket_channel: ^2.0.0
  yaml: ^3.0.0

dev_dependencies:
  build_test: ^2.0.0
  build_web_compilers: ^3.0.0
  lints: '>=1.0.0 <3.0.0'
  stream_channel: ^2.0.0
  test: ^1.16.0
  test_descriptor: ^2.0.0
  test_process: ^2.0.0
  _test_common:
    path: ../_test_common

点开这个库在Pub仓库里的Scores,找到Platform support,点开查看详情:

Flutter & Dart问题记录 - Package类型项目的平台支持_第4张图片

可以看到Package只兼容Windows/Linux/MacOS平台的原因是有声明,那我在已经创建好的Flutter Package项目里加上平台声明是不是能限制依赖?经测试是不行的,该依赖还是依赖,其实不用测也知道,大部分人应该都用过json_serializable吧,这个库用于JSON序列化,用到了dart:mirrors(反射)和dart:io,被Pub仓库识别为不兼容Android/iOS/Web平台,但Flutter开发时还是可以依赖这个库通过反射生成JSON序列化相关代码。所以,Package的平台支持是不会限制你依赖的,但只要你用在了不支持的平台或不对的时机,那可能就无法正常使用了。

通过以上两个示例,现在大致可以知道为什么有些库显示只支持某些平台的原因,一是使用了不兼容全平台的API,二是显式声明了支持的平台。

但是好像这两个示例的pubspec.yaml内容和Flutter Package项目的pubspec.yaml内容有点不一样,最明显的是没有默认依赖Flutter SDK,之所以没有依赖Flutter SDK,这是因为以上两个示例是Dart Package项目。

感兴趣的可以自己创建一个Dart Package项目,如果你用的是Android Studio,可以通过[File]->[New]->[New Flutter Project…]->[Dart]创建,点击[Next]前要检查Dart SDK路径。

Flutter & Dart问题记录 - Package类型项目的平台支持_第5张图片

也可以通过命令行创建:

dart create 项目名称 -t package

在Pub仓库翻了翻,发现不支持全平台的Package大部分都是Dart Package项目,当然,Flutter Package项目也是有的,例如腾讯IM相关的tencent_cloud_chat_uikit,这个库是显式声明只支持Android/iOS/Web平台。所以,虽然创建Flutter Package项目时无法选择平台,但是可以手动显式声明需要支持的平台。

解决方案

如果创建的Flutter Package项目明确只支持部分平台,那么可以显式声明支持的平台,如果不确定,可以交给Pub仓库自动检测。

pubspec文件关于Platforms字段的说明与使用:

Flutter & Dart问题记录 - Package类型项目的平台支持_第6张图片

总结

熬夜把这篇文章补完了。

最后

如果这篇文章对你有所帮助,请不要吝啬你的点赞加星,谢谢~

你可能感兴趣的:(问题记录,flutter)