Skip to content

Latest commit

 

History

History
72 lines (42 loc) · 5 KB

develop-dotnet-plugins.md

File metadata and controls

72 lines (42 loc) · 5 KB

Flow is written in C#, so plugins written in .NET platform can directly communicate with Flow without extra protocols.

Initialization

For C# Plugins, We recommend you use the dotnet template to generate a plugin template.

To be recognized as a Flow DotNet plugin, the directory needs to have at least two files

  1. plugin.json
  2. A Dotnet Assembly that implements IPlugin or IAsyncPlugin (remember to reference Flow.Launcher.Plugin by Nuget). The plugin template will add the reference and create a Main.cs that implements IPlugin.

Find our API Reference here

A sample CSharp Plugin here

IPlugin/IAsyncPlugin

The Mainclass that implements IPlugin or IAsyncPlugin will handle the query search with Flow.

IPlugin interface contains two required methods:

  1. void Init(PluginInitContext context)
    • PluginInitContext exposes some API from Flow and a metadata object for your plugin.
    • It will be invoked before the invocation of Query, so you can do some preparation here.
    • We recommend you do expensive operations in this method instead of Object Constructor because this method will be executed in parallel with other plugins.
  2. List<Result> Query(Query query)
    • Query will be invoked when user activates this plugin with specific ActionKeyword.
    • A List of Result object should be returned.

IAsyncPlugin is the async version of IPlugin

  • Instead of implementing Init and Query, you will need to implement InitAsyncand QueryAsync, which use Task,Task<List<Result> as return value to allow using async/await strategy
  • QueryAsync provides a CancellationToken token to allow you to check whether user has typed a new query.

Additional interfaces

Besides the basic implementation of IPlugin/IAsyncPlugin, plugins can also implement a series of interfaces that belong to IFeatures to control more communication with Flow.

Remarks: You should implement these interfaces in the same class that implements IPlugin/IAsyncPlugin.

LoadContextMenus will be invoked when users expand the context menu of a specific Result. The return value of LoadContextMenus is similar to Results from Query/QueryAsync.

ReloadData/ReloadDataAsync will be invoked when users click the Reload Plugin Data command from sys plugin. Generally, it is used to reload some cache (such as the programs information cached in Program plugin).

IPluginI18n means the plugin has been internationalized. Therefore, Flow will load the additional language resources from /Languages when loading the plugin. By implementing this interface with additional language files, Flow will be able to load plugin-specific localized language resources. You will be able to get the translated text with IPublicAPI.GetTranslation(string key).

Language Resource

A Language Resource file will have name of the specific Language Code with suffix .xaml. The information of the Language Code can be found here AvailableLanguages.cs. The Language Resource file will need to be a list of key/value pair. Follow the examples found here.

Remark

Plugins are required to implement IPublicI18n to let Flow load Language resources.

Implementing IResultUpdated provides a way to return part of the query results early. This is generally useful for plugins with long-running queries.

To early return a result to Flow, you will need to invoke ResultUpdated event with an ResultUpdatedEventArgs, which includes the current Query object and the List of Result objects similar to the return value in Query(Async).

IDisposable Flow 1.8.0 or higher

Implementing IDisposable to dispose unmanaged resource in the plugin. Dispose() will be called when Flow exit.