前提
Flutterのアプリ開発の勉強をしています。(Flutter開発を始めたばかりです)
ローカル通知の機能を試しに実装をしていて、何の通知が登録されているかを表示しようとしています。
画面と機能としては以下の通りです
- 今すぐ通知(クリックすると通知が即座に表示されます)
- 通知をスケジュール(クリックすると60分後に通知が表示されます)
- スケジュールされた通知をすべてキャンセル(クリックすると登録された通知が削除されます)
- 画面中央から下部(登録された通知をテキスト形式で表示しています)
実現したいこと
実現したいことは以下の通りです。
-
「通知をスケジュール」を押すと、下のテキスト部分に、通知の情報が追加で表示されてほしいです。
- 現状だと、他のページに移ってから戻らないと更新されないので困っています。
-
またテキスト形式でなくListViewなどで登録されている通知を一つ一つ表示する方法もわからないので教えてほしいです。
該当のソースコード
画面に対するソースコード
Dart
1import 'package:flutter/material.dart'; 2import './notifications_utils.dart'; 3 4class AccountPage extends StatefulWidget { 5 const AccountPage({super.key}); 6 7 8 State<AccountPage> createState() => _AccountPageState(); 9} 10 11class _AccountPageState extends State<AccountPage> { 12 late Stream<String> data; 13 14 15 void initState() { 16 data = NotificationsUtils.getScheduled(); 17 super.initState(); 18 } 19 20 21 Widget build(BuildContext context) { 22 return Scaffold( 23 appBar: AppBar( 24 title: const Text("Account page"), 25 ), 26 body: Center( 27 child: Column( 28 children: [ 29 // 今すぐ通知 30 TextButton( 31 onPressed: () { 32 NotificationsUtils.notifyNow(); 33 }, 34 child: const Text('今すぐ通知'), 35 ), 36 37 // 通知をスケジュール 38 TextButton( 39 onPressed: () { 40 NotificationsUtils.scheduleNotifications( 41 DateTime.now().add(const Duration(seconds: 60)), 42 ); 43 }, 44 child: const Text('通知をスケジュール'), 45 ), 46 47 // スケジュールされた通知をすべてキャンセル 48 TextButton( 49 onPressed: () { 50 NotificationsUtils.cancelNotificationsSchedule(); 51 }, 52 child: const Text('スケジュールされた通知をすべてキャンセル'), 53 ), 54 // 登録された通知を表示 55 StreamBuilder( 56 stream: data, 57 builder: (BuildContext context, AsyncSnapshot<String> snapshot) { 58 if (snapshot.hasData) { 59 return Text(snapshot.data!); 60 } else if (snapshot.hasError) { 61 return Text('${snapshot.error!}'); 62 } else { 63 return const CircularProgressIndicator(); 64 } 65 } 66 ) 67 ], 68 ), 69 ), 70 ); 71 } 72} 73
通知に関するソースコード
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:timezone/timezone.dart' as tz; class NotificationsUtils { // 今すぐ通知する static Future<void> notifyNow() async { final flnp = FlutterLocalNotificationsPlugin(); flnp.show( 0, '手動通知', 'あなたがボタンをタップしました', const NotificationDetails( android: AndroidNotificationDetails( '1', '手動通知', importance: Importance.high, priority: Priority.high, ), iOS: DarwinNotificationDetails( presentSound: true, ), ), ); } // 通知をスケジュール static Future<void> scheduleNotifications(DateTime dateTime, {DateTimeComponents? dateTimeComponents}) async { // idを動的に生成 String id = '${dateTime.hour}${dateTime.minute}'; // 日時をTimeZoneを考慮した日時に変換する final scheduleTime = tz.TZDateTime.from(dateTime, tz.local); // 通知をスケジュールする final flnp = FlutterLocalNotificationsPlugin(); await flnp.zonedSchedule( int.parse(id), 'スケジュール通知', 'あなたがスケジュールした時間になりました', scheduleTime, const NotificationDetails( android: AndroidNotificationDetails( '2', 'スケジュール通知', importance: Importance.high, priority: Priority.high, ), iOS: DarwinNotificationDetails( presentSound: true, ), ), uiLocalNotificationDateInterpretation: UILocalNotificationDateInterpretation.absoluteTime, androidAllowWhileIdle: true, matchDateTimeComponents: DateTimeComponents.time, ); } // 登録されている通知の確認 static Stream<String> getScheduled() async* { final flnp = FlutterLocalNotificationsPlugin(); final List<PendingNotificationRequest> pendingNotificationRequests = await flnp.pendingNotificationRequests(); String str = ''; for (var pendingNotificationRequest in pendingNotificationRequests) { str += '予約済みの通知: [id: ${pendingNotificationRequest.id}, title: ${pendingNotificationRequest.title}, body: ${pendingNotificationRequest.body}, payload: ${pendingNotificationRequest.payload}] ¥n'; } yield str; } // 通知をキャンセル static Future<void> cancelNotificationsSchedule() async { final flnp = FlutterLocalNotificationsPlugin(); await flnp.cancelAll(); } }
試したこと
上記のコードでは上手くいきませんでした。
お力添えよろしくお願いします。
補足
通知はここを参考に実装しました
https://hondakenya.work/flutter-local-notifications-sample/
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/02 06:50
2023/01/02 06:58
2023/01/02 06:59