From 78b23af75a13ca28c3fbbca29fd70f12786f1445 Mon Sep 17 00:00:00 2001 From: Apalak Dutta Date: Sun, 26 Jun 2022 22:50:40 +0530 Subject: [PATCH] Refactor notification --- lib/services/notification_service.dart | 63 ++++++++++++++------------ lib/ui/my_home_screen.dart | 60 +++++++++++++++--------- 2 files changed, 72 insertions(+), 51 deletions(-) diff --git a/lib/services/notification_service.dart b/lib/services/notification_service.dart index 1e7be30..5954c0a 100644 --- a/lib/services/notification_service.dart +++ b/lib/services/notification_service.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_native_timezone/flutter_native_timezone.dart'; import 'package:get/get.dart'; +import 'package:sqflite_pust_local_notification/models/task_model.dart'; import 'package:timezone/data/latest.dart' as tz; import 'package:timezone/timezone.dart' as tz; @@ -9,7 +11,7 @@ class NotifyHelper { FlutterLocalNotificationsPlugin(); // initializeNotification() async { - tz.initializeTimeZones(); + _configureLocalTimezone(); final IOSInitializationSettings initializationSettingsIOS = IOSInitializationSettings( requestSoundPermission: false, @@ -48,10 +50,12 @@ class NotifyHelper { channelDescription: '', importance: Importance.max, priority: Priority.high); + var iOSPlatformChannelSpecifics = new IOSNotificationDetails(); var platformChannelSpecifics = new NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.show( 0, title, @@ -61,46 +65,45 @@ class NotifyHelper { ); } - scheduledNotification() async { + scheduledNotification(int hours, int minutes, TaskModel taskModel) async { + print("Call Notification"); await flutterLocalNotificationsPlugin.zonedSchedule( - 0, - 'scheduled title', - 'theme changes 5 seconds ago', - tz.TZDateTime.now(tz.local).add(const Duration(seconds: 5)), + taskModel.id!.toInt(), + taskModel.title, + taskModel.note, + _convertTimeDeration(hours, minutes), + //tz.TZDateTime.now(tz.local).add(const Duration(seconds: 5)), const NotificationDetails( android: AndroidNotificationDetails( 'your channel id', 'your channel name', channelDescription: '')), androidAllowWhileIdle: true, uiLocalNotificationDateInterpretation: - UILocalNotificationDateInterpretation.absoluteTime); + UILocalNotificationDateInterpretation.absoluteTime, + matchDateTimeComponents: DateTimeComponents.time); + } + + tz.TZDateTime _convertTimeDeration(int hours, int minutes) { + final tz.TZDateTime now = tz.TZDateTime.now(tz.local); + print(now); + tz.TZDateTime scheduleDate = + tz.TZDateTime(tz.local, now.year, now.month, now.day, hours, minutes); + + if (scheduleDate.isBefore(now)) { + scheduleDate = scheduleDate.add(const Duration(days: 1)); + } + print(scheduleDate); + return scheduleDate; + } + + Future _configureLocalTimezone() async { + tz.initializeTimeZones(); + final String timeZone = await FlutterNativeTimezone.getLocalTimezone(); + tz.setLocalLocation(tz.getLocation(timeZone)); } Future onDidReceiveLocalNotification( int id, String? title, String? body, String? payload) async { - // display a dialog with the notification details, tap ok to go to another page - // showDialog( - // //context: context, - // builder: (BuildContext context) => CupertinoAlertDialog( - // title: Text(title), - // content: Text(body), - // actions: [ - // CupertinoDialogAction( - // isDefaultAction: true, - // child: Text('Ok'), - // onPressed: () async { - // Navigator.of(context, rootNavigator: true).pop(); - // await Navigator.push( - // context, - // MaterialPageRoute( - // builder: (context) => SecondScreen(payload), - // ), - // ); - // }, - // ) - // ], - // ), - // ); Get.dialog(Text("Welcome to Flutter")); } diff --git a/lib/ui/my_home_screen.dart b/lib/ui/my_home_screen.dart index f0741eb..9dfc2a3 100644 --- a/lib/ui/my_home_screen.dart +++ b/lib/ui/my_home_screen.dart @@ -70,8 +70,6 @@ class _MyHomeScreenState extends State { body: Get.isDarkMode ? "Activated Light Mode" : "Activated Dark Mode"); - - notifyHelper.scheduledNotification(); }, child: Icon( Get.isDarkMode ? Icons.wb_sunny_outlined : Icons.nightlight_round, @@ -136,7 +134,9 @@ class _MyHomeScreenState extends State { dayTextStyle: datePickerTextStyle, monthTextStyle: datePickerTextStyle, onDateChange: (Date) { - _selectedDate = Date; + setState(() { + _selectedDate = Date; + }); }, ), ); @@ -148,29 +148,47 @@ class _MyHomeScreenState extends State { return ListView.builder( itemCount: _taskController.taskList.length, itemBuilder: (_, index) { - print( - "Task Count :" + _taskController.taskList.length.toString()); - return AnimationConfiguration.staggeredList( - position: index, - child: SlideAnimation( - child: FadeInAnimation( - child: Row( - children: [ - GestureDetector( - onTap: () { - _showBottomSheet( - context, _taskController.taskList[index]); - }, - child: TaskTile(_taskController.taskList[index]), - ) - ], - )), - )); + TaskModel taskModel = _taskController.taskList[index]; + print(taskModel.toJson()); + if (taskModel.repeat == "Daily") { + DateTime date = + DateFormat.jm().parse(taskModel.startTime.toString()); + var myTime = DateFormat("HH:mm").format(date); + print(myTime); + notifyHelper.scheduledNotification( + int.parse(myTime.toString().split(":")[0]), + int.parse(myTime.toString().split(":")[1]), + taskModel); + return _setTAskView(index, taskModel); + } + if (taskModel.date == DateFormat.yMd().format(_selectedDate)) { + return _setTAskView(index, taskModel); + } else { + return Container(); + } }); }, )); } + _setTAskView(int index, TaskModel taskModel) { + return AnimationConfiguration.staggeredList( + position: index, + child: SlideAnimation( + child: FadeInAnimation( + child: Row( + children: [ + GestureDetector( + onTap: () { + _showBottomSheet(context, taskModel); + }, + child: TaskTile(taskModel), + ) + ], + )), + )); + } + _showBottomSheet(BuildContext context, TaskModel taskModel) { Get.bottomSheet(Container( padding: const EdgeInsets.only(top: 4),