跳过导航
Sketch 内幕

使用数据做更多:为 Sketch 构建数据提供插件

将真实数据引入 Sketch 是真正测试设计的最佳方式。通过构建数据插件,您可以更进一步。

在 Sketch 52 中,我们引入了一项令人兴奋的新功能——数据。如果您还没有阅读过相关信息,请务必查看我们的发布博文,或者观看 Peter Nowell 精彩的介绍视频,该视频是他的新 UX Design in Sketch 课程的一部分。

这个新功能可以非常容易地将数据导入到你的设计中,并且尽可能轻松地解决最常见的用例——“只需给我一些随机的东西”

但是,如果您有稍微复杂的需求怎么办?如果您不希望您的数据是随机的,而是完全可预测的怎么办?如果您需要您的数据更智能怎么办?

输入数据提供插件

在设计数据功能时,我们希望它对大多数客户来说尽可能简单,但为更高级的用户扩展其功能敞开了大门。为了做到这一点,我们将其构建在已经非常强大的插件后端之上,并添加了一个新的 API——DataSupplier

使用它,你可以构建一个 Sketch 插件,将数据源添加到应用程序中,使其对客户来说易于使用,同时仍然可以利用你可以使用插件做的所有很酷的事情。但是,在我们开始构建数据提供插件之前,值得了解数据功能在底层是如何工作的。

Sketch 支持图层的两种数据类型:**图像**和**纯文本**。单个插件可以提供多种数据类型,因此如果您需要同时提供文本和图像,您只需一个插件即可完成。当在应用程序中选择图层时,或者在检查器中单击覆盖的数据图标时,Sketch 会为每种图层类型启用相关的源。我们将在后面学习如何注册每种数据类型的插件。

当用户在 Sketch 中请求某些数据时,它会将该请求传递给相关的插件,以及满足该请求所需的一些重要信息(在 context.data 中)。然后,您的插件将进行一些神奇的操作来生成、收集或下载数据,并将其发送回 Sketch,以便它将数据放置在相关的图层上。你可以通过一步完成——通过向 Sketch 发送数据数组——或者逐个返回数据(如果您从可能需要一两秒钟下载的网络获取数据,这将非常有用)。

说够了,给我看代码!数据提供插件示例

在这篇文章中,我们将介绍一个简单的示例,向你展示如何构建一个数据提供插件(别担心,我们在最后还有更复杂的示例,如果你想要一些灵感)。它假设你对我们的插件平台有一定的了解,但如果你懂一点 JavaScript,你也可以理解。

我们将使用我们的命令行工具来创建、开发和发布 Sketch 插件,skpm。如果它尚未安装在你的系统中,请打开 Terminal.app,并运行此命令

npm install --global skpm

请注意,skpm 需要安装 Node.js,但这不是本教程的重点。如果您需要帮助安装它,请查看他们的文档

skpm 最好的功能之一是能够使用模板来创建插件,我们已经专门为数据创建了一个模板:https://github.com/skpm/with-datasupplier

要使用它,让我们使用它创建一个新的插件

skpm create datademo --template=skpm/with-datasupplier

这将创建一个 datademo 文件夹,向其中添加一些文件,安装所有必需的依赖项,并为你提供有关如何从此处继续操作的一些说明。我们将

cd datademo

然后

npm run build

这将构建我们的数据插件,并使其在 Sketch 中可用。你可以在偏好设置中的插件部分看到你的插件

也可以在新的数据部分中看到,以及其他数据源

如果你现在向一个新文档添加一堆文本图层,然后选择数据 > datademo,你将看到我们的示例插件正在做什么:生成随机数并用它们填充文本图层。

现在让我们看一下代码,了解这里发生了什么。在你的代码编辑器中,打开我们创建的 datademo 文件夹,然后打开 src/my-command.js。暂时忽略 onStartuponShutdown 函数,直接转到 onSupplyData。这是 Sketch 在向插件请求数据时调用的方法,它做了四件事

  1. 从上下文中获取数据键,以便稍后可以返回数据
  2. 迭代受操作影响的图层
  3. 为每个图层生成一个随机数,以及
  4. 将数据发送回 Sketch

**第 1 步**是从 context.data 对象中获取 key 属性。这是一个它包含的属性列表

  • 一个 key 属性,这是一个 UUID,你的插件将使用它将数据返回到正确的请求
  • 一个 items 属性,这是一个 NSArray,其中包含 Sketch 需要数据的图层或覆盖的列表
let dataKey = context.data.key

**第 2 步**是通过对 Sketch 需要数据的图层集合执行基本的 forEach 操作来实现的。该集合位于 context.data.items。根据用户触发该功能的方式,这些项目可以是图层或覆盖。

const items = util.toArray(context.data.items).map(sketch.fromNative)
items.forEach((item, index) => {
  // do stuff here…
})

**第 3 步**只是生成随机数

let data = Math.random().toString()

不要让这个基本示例迷惑你:你可以在这里做你需要的任何事情。从在线 API 获取动态天气数据?将图层的文本翻译成印度尼西亚语?从你的生产数据库下载真实数据以设置产品的图片?让你的想象力飞翔…

最后,**第 4 步**只是将我们生成的数据转发到 DataSupplier 对象,以便它将其发送回 Sketch。

DataSupplier.supplyDataAtIndex(dataKey, data, index)

其中 dataKey 是我们在上下文(在 context.data.key 中)中传递的键。在这种情况下,我们使用 supplyDataAtIndex 方法逐个发送数据,但我们可以将数据存储在一个 Array 对象中,然后使用 supplyData 方法一次性传递所有数据。

let count = context.data.items.count()
let dataKey = context.data.key
let data = Array.from(Array(count)).map(i => Math.random().toString())
DataSupplier.supplyData(dataKey, data)

使用图像的操作完全相同,只是你需要提供磁盘上图像文件的路径。如果你想使用来自在线服务的图像,你需要将它们下载到临时位置。请查看我们自己的 Unsplash 插件,了解如何做到这一点的示例。

另一个有趣的例子是这个随机翻译器插件,我们使用 Yandex API 将 Sketch 中的文本图层翻译成随机语言(因为没有什么比意外的单词长度和时髦的字符更能破坏你的设计了!)

向 Sketch 注册我们的插件

现在我们有一些很棒的代码可以生成随机数,我们需要告诉 Sketch 关于它的信息。为此,我们需要向我们的 manifest.json 添加一个属性(这已经在 skpm 模板中为我们设置好了)

"suppliesData": true

我们还需要告诉 Sketch 我们的插件提供哪些数据类型,以及调用哪个函数来从我们的插件获取数据。这是通过 manifest 文件中的 actions 部分完成的,我们将在其中添加 Startup / Shutdown 的处理程序(以注册 / 注销我们的插件),以及一个在调用插件时触发的事件的处理程序(你可以为你的事件使用任何你想要的名字,SupplyData 只是我们在示例中使用的名称)

{
  "actions": {
    "Startup": "onStartup",
    "Shutdown": "onShutdown",
    "SupplyData": "onSupplyData"
  }
}

然后,在 my-command.js 中,我们在 onStartup 方法中注册插件

export function onStartup() {
  DataSupplier.registerDataSupplier('public.text', 'datademo', 'SupplyData')
}

这告诉 Sketch 为 SupplyData 事件注册一个名为 datademo 的文本数据提供器。如果你希望你的插件提供图像,你需要使用 public.image 作为第一个参数。

延伸阅读

如果你想了解更多关于 DataSupplier 功能的信息,这里有一些你想查看的链接

总结

今天就到这里!我们已经介绍了相当多的内容,我们相信这些内容足以让你忙碌,直到我们在本系列的第二部分再次相遇,在那里我们将学习如何使用 Data 和 Symbol Overrides。

在那之前,玩得开心! 别忘了与我们分享你的作品,我们很乐意看到你正在构建的东西。

您可能也喜欢

Sketch 内幕

Sketch 和 AI

一段时间以来,我们一直在思考 AI 对 Sketch 的意义。 这是我们可能使用它的方式、我们永远不会使用它的方式,以及指导我们思考的因素。

免费试用 Sketch

无论您是 Sketch 的新手,还是回来看看有什么新功能,我们都会让您在几分钟内完成设置并准备好完成您的最佳作品。

免费开始
免费开始