you can use flutter_local_notification and it has a feature called scheduling-a-notification and also you need to provide timezone with timezone package to work that,
Import the timezone package
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
Initialise the time zone database
tz.initializeTimeZones();
Once the time zone database has been initialised, developers may optionally want to set a default local location/time zone, you can use https://pub.dev/packages/flutter_native_timezone to getting the local timezone of the os.
tz.setLocalLocation(tz.getLocation(timeZoneName));
Assuming the local location has been set, the zonedScheduled method can then be called in a manner similar to the following code
await flutterLocalNotificationsPlugin.zonedSchedule(
0,
'scheduled title',
'scheduled body',
tz.TZDateTime.now(tz.local).add(const Duration(seconds: 5)),
const NotificationDetails(
android: AndroidNotificationDetails('your channel id',
'your channel name', 'your channel description')),
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime);