跳過導航
Sketch 內幕

更有效地運用數據: 為 Sketch 建立數據供應器外掛程式

將真實數據導入 Sketch 是真正測試設計的最佳方法。透過建構數據外掛程式,您可以更進一步。

在 Sketch 52 中,我們推出了令人興奮的新功能 — 數據。如果您還沒有閱讀相關資訊,請務必查看我們的版本發佈部落格文章,或者看看 Peter Nowell 的精彩介紹影片,這是他在 Sketch 中的全新 UX 設計課程的一部分。

這個新功能讓您輕鬆地將數據導入設計中,並以最輕鬆的方式解決最常見的使用案例 — 「只要給我一些隨機數據」

但如果您有更複雜的需求呢?如果您不希望數據是隨機的,而是完全可預測的呢?如果您需要更智慧的數據呢?

認識數據供應器外掛程式

當我們設計數據功能時,我們希望它對大多數用戶來說盡可能簡單,但同時也為更進階的用戶保留擴展其功能的空間。為了做到這一點,我們將其建構在我們已經非常強大的外掛程式後端之上,並添加了一個新的 API — DataSupplier

使用這個 API,您可以建構一個 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 屬性,它是一個包含 Sketch 需要數據的圖層或覆蓋列表的 NSArray
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 方法逐個發送數據,但我們可以將數據存儲在數組對象中,然後使用 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 功能的信息,可以查看以下連結:

總結

今天就到這裡!我們已經介紹了很多內容,相信這會讓您忙到我們在本系列的第二部分再次見面,屆時我們將學習如何使用數據和符號覆蓋。

在此之前,祝您玩得開心!別忘了與我們分享您的作品,我們很樂意看到您的成果。

您可能還喜歡

免費試用 Sketch

無論您是 Sketch 新手,還是回來查看新功能,我們都能讓您在幾分鐘內設置好並準備好完成您的最佳工作。

免費開始使用
免費開始使用