Flutterアプリでショートカット/クイックアクション機能を実装する
はじめに
個人で開発しているサブスク管理アプリsubskunでショートカット機能を実装しました。
ショートカット機能はホーム画面のアプリアイコンを長押ししたときに表示されるアレです。iOSではクイックアクションと呼ばれているようです。

方法
パッケージ
quick_actionsというパッケージを使用します。現時点での最新パージョンは1.0.1です。
実装方法
実装方法は簡単で、QuickActionsクラスのインスタンスに対してinitializeとsetShortcutItemsでショートカットの設定をします。
呼び出す場所はドキュメントでは”early in your application's lifecycle”と書かれています。特に理由がなければ一番最初に出てくるページのinitState内などで良いかと思います(サンプルでもそうなっています)。
const quickActions = QuickActions();
// ショートカットが呼び出されたときの処理をコールバックに設定する
quickActions.initialize((shortcutType) {
if (shortcutType == 'create') {
// 呼ばれたショートカットの種類によって処理を出し分ける
}
});
// 利用できるショートカットの種類とアイコンを設定
// typeはShortcutItem内で一意の名前にする必要があり、これがinitizeliaのコールバックの引数になる
quickActions.setShortcutItems(
[
ShortcutItem(
type: 'create',
localizedTitle: '作成',
icon: 'ic_create',
),
],
);
アイコンを用意
ショートカットで利用されるアイコンのファイル名はShortcutItemのiconで設定したものになります。
画像の配置位置は、Androidではdrawableまたはmipmapに、iOSではAssets.xcassetsに配置します。また、iOSでは画像サイズごとにファイル名の末尾に-20x20@1xなどがつくと思います。
Androidでの追加対応
Androidの本番環境で動作確認をしてみると、アプリの設定次第ではショートカットのアイコンが表示されない問題が発生することがあります。

Androidではビルド時の設定でリソースの圧縮が有効になっていると、未使用のリソースが削除されます。これによって上記の問題が発生します。
この問題は指定したリソースを削除しないよう明示的に設定しておくことで回避できます。
具体的にはリソースのtools:keep属性を利用することで、保持するリソースを指定することができます。
res/raw/keep.xmlというファイルに、以下のようなxmlを作成します。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@mipmap/ファイル名" />
これでビルドしてみると、ショートカットのアイコンが表示されるようになりました。
おわり
ショートカット機能はとても便利ですが、普段スマホを使っていてもショートカット/クイックアクション機能がそもそもOSに搭載されていることを知らないユーザーもたくさんいそうですね…