flutter_local_notificationsのonSelectNotification属性が、アプリを閉じたバックグラウンド状態だと動作しない
![](https://halzoblog.com/wp-content/uploads/2021/10/00_image000.png)
結論:「getNotificationAppLaunchDetails()」メソッドで「didNotificationLaunchApp」プロパティを取得する
2022/5/10 Flutter エラー・バグ日記
以前、こちらの日記で、「flutter_local_notifications」のパッケージを使い、通知をタップしたら特定画面を開く「onSelectNotification」属性の利用方法を書いたが、実はアプリを閉じた状態で通知をタップすると、動作しないと分かった。。。
「onSelectNotification」属性に設定したメソッド内に、print文を入れてチェックしたが、アプリを閉じた状態だとprint文が表示されず、「onSelectNotification」属性自体が機能しないと分かった。
通知はアプリを閉じた状態でタップするのが普通なので、何とか解消したい。。
「flutter_local_notifications」の通知の設定方法に関する解説記事は多いが、通知をタップしたときの処理に関する情報は意外と少ない。。
色々と調べてみると、こちらの記事で全く同じ質問がなされていることを発見。
結論としては、「getNotificationAppLaunchDetails()」メソッドで、通知のタップからアプリを起動したか否かを判別する「didNotificationLaunchApp」プロパティを取得すれば良いとのこと。
確かに、パッケージ公式のExampleでも、このメソッドが使われていたが、よく分からずスルーしてしまっていた。。
具体的には、アプリ起動時のmain関数内に、以下のように追加することで対処できた。
// 注:既成ライブラリ内の名称と区別するため、自作した変数・メソッド・クラス名の末尾には「O」を付けて表記 // グローバルで「FlutterLocalNotificationsPlugin」クラスのインスタンスを定義 final FlutterLocalNotificationsPlugin flutterLocalNotificationsPluginO = FlutterLocalNotificationsPlugin(); // アプリ起動時のmain関数 void main() async{ // main関数内で非同期処理するときの決まり文句 WidgetsFlutterBinding.ensureInitialized(); // ローカル通知初期化 // 詳細省略(NotificationServiceOというシングルトンクラス内に、initOという初期化メソッドを作成している) await NotificationServiceO.notificationServiceO.initO(); // アプリを通知から起動したか否かを判定するプロパティを取得するメソッド // detailsO.payload でペイロード(通知から渡される文字列)にアクセスできる // ※payloadは、「show」または「zonedSchedule」メソッド内で設定(詳細省略) var detailsO = await flutterLocalNotificationsPluginO .getNotificationAppLaunchDetails(); // アプリを通知から起動した場合は、MyAppにペイロードを引数として渡す // 通知からの起動ではない場合は、空白文字を渡す runApp(child: MyApp( payloadO: (detailsO.didNotificationLaunchApp) ? detailsO.payload : "", )); } // 以降、MyAppクラス以下で、detailsO.payload の内容に応じた処理を書いていく
「getNotificationAppLaunchDetails()」メソッドで取得するプロパティ経由で、通知をタップしたときに、通知内容をアプリに渡すための「payload」(※)にアクセスできる。
(※)手動通知の「show」メソッド、またはスケジュール通知の「zonedSchedule」メソッドの「payload」属性に設定するString型変数
また、上記記事の中で、通常のアプリ起動時にも「payload」が渡されてしまう旨のコメントがあったが、自分の場合は、「didNotificationLaunchApp」が「false」だった場合は、「payload」を空白文字に設定した上で、MyAppクラスに渡すことで回避できた。
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/