如何在 Flutter 包/插件开发中添加资产?

Posted

技术标签:

【中文标题】如何在 Flutter 包/插件开发中添加资产?【英文标题】:How to add assets in flutter Package/Plugin development? 【发布时间】:2019-07-11 10:49:01 【问题描述】:

我正在开发一个包含一些资产文件的颤振包。我像往常一样在 pubsepc.yaml 中提到了所需的资产

  assets:
    - assets/abc.xyz

并将包上传到https://pub.dartlang.org/。

之后我创建了一个颤振应用程序并将我开发的包导入pubspec.yaml 就像...

dependencies:
  flutter:
    sdk: flutter
  my_developed_package: ^0.0.1

现在一切正常,除了我的资产不存在。 我在我的应用程序中放置了一些资产,而在pubsepc.yaml 及其工作中没有提及。我无法理解,如何将这些资产添加到我的包中以便它们自动加载?

【问题讨论】:

【参考方案1】:

引用from

如果在 pubspec.yaml 文件中指定了所需的资产 包,它会自动与应用程序捆绑在一起。在 特别是,包本身使用的资产必须在其 pubspec.yaml。

在 Flutter 中,您可以使用包中的资产,这应该不是问题。唯一的事情是,您需要指定您的包并导入它。例如。如果是图片,可以使用AssetImage类,它是package属性。

AssetImage('assets/abc.xyz', package: 'my_developed_package');

有关如何调用文本和其他内容的更多信息,请查看here。

【讨论】:

我明白了这一点,但我希望他们在有人安装我的插件时自动添加。如何做到这一点? 如果您在编辑后的答案中看到引用的信息,您可以看到,打包资产自动绑定到应用程序。 只有 AssetImage 允许你指定一个包。如果你想加载一个 json 文件,它就不起作用,而且我发现文档很难理解。它指出您可以拥有未在 pubspec.yaml 中定义的资产,但在下一句中仍然说您必须在 pubspec.yaml 中定义它们。 @eimmer - 您可以拥有多个资产,您可以指定一些但不一定全部可供软件包用户使用。其余的将供您的包裹自己使用,但不会暴露在外界。 非常感谢您的回答。已经找了好几个小时了。只有当我可以选择这个作为最佳答案时,因为下面的答案要实现同样的目标有点艰巨。【参考方案2】:

抱歉,回答迟了,但以下方法帮助我在插件开发中包含资产(不仅是图像,还包括任何类型的文件)。

我将我的资产放在lib 文件夹下,例如my_plugin/lib/assetspubspec.yaml,就像这样。

  assets:
    - packages/my_plugin/assets/asset_name
       
  # Be careful about indentation

它已与插件一起添加,然后我使用这样的路径访问它们 packages/my_plugin/assets/asset_name,例如

File myAsset = File("packages/my_plugin/assets/asset_name");

通过这种方法,我能够从插件中获取任何资产,而不仅仅是图像。

完整的例子可以查看我的插件here。

【讨论】:

这是中奖者,谢谢!我花了整个上午试图让我的包加载它自己的 JSON 文件,并发现颤振文档有点......不清楚。 我想从插件资产中读取 json 文件,你能帮帮我吗? 这可行,但我必须在应用程序的pubspec.yaml 下的assets: 下分别包含每个资产文件。有什么方法可以将所有资产都包含在一个包文件夹下,就像对应用程序中的普通资产一样? 谢谢!我可以确认这行得通。我在包项目的 pubspec.yaml` 中指定了 txt 文件,并通过rootBundle.loadString('packages/package_name/file.txt) 访问它。请注意,该文件位于package_name/lib/file.txt。无需指定lib 文件夹【参考方案3】:

要从 package 依赖项加载图像,必须将 package 参数提供给 AssetImage

例如,假设您的应用程序依赖于一个名为 my_icons 的包,该包具有以下目录结构:

.../pubspec.yaml
.../icons/heart.png
.../icons/1.5x/heart.png
.../icons/2.0x/heart.png
...etc.

要加载图像,请使用:

AssetImage('icons/heart.png', package: 'my_icons')

包本身使用的资产也应使用上述package 参数获取。

【讨论】:

【参考方案4】:

Pubspec yaml 对缩进敏感

有区别

 assets:
  - packages/my_plugin/assets/asset_name

VS

 assets:
   - packages/my_plugin/assets/asset_name

如果你仔细观察以上两个,你会发现 pubspec.yaml 非常敏感

总是写

assets:
  -asset/yourasset/example1

行首必须有两个空格。

将资产链接添加到 pubspec 后,您必须运行 packages get 如果您正确放置资产,它将显示退出并显示 0 错误,否则它将显示错误背后的原因。

一般来说,初学者都会面临这些类型的问题。随着时间的推移,您将破解解决此错误的方法

【讨论】:

【参考方案5】:

将资产添加到 Flutter 包可能会很困难! 只需按照这些步骤,您就可以开始了...

第一步:在Package根目录下创建一个assets文件夹

第 2 步:将其添加到您的 pubspec.yaml 文件中

flutter:
  assets:
    - assets/asset_name

# Mind the indentation

第 3 步:将资产用于图像文件

AssetImage('assets/asset_name.png', package: 'your_package_name')

运行 Pub.dev 并使用 Package 和

为 Flutter 应用程序执行 冷启动

瞧,你完成了。

【讨论】:

如何从包中加载非图像资产?例如.json 还是 .dat 文件?

以上是关于如何在 Flutter 包/插件开发中添加资产?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter Web 中添加插件?

Flutter开发 Flutter 包和插件 ( 开发 Dart 插件包 | 发布 Dart 插件包 )

Flutter开发 Flutter 包和插件 ( Flutter 包和插件简介 | 创建 Flutter 插件 | 创建 Dart 包 )

集成 iOS 原生插件到 flutter 项目

如何将新标头添加到 Flutter 插件 iOS 项目?

开发 Flutter iOS 插件包 - Xcode 项目中的 Pods 文件夹为空