#android #flutter #push-notification #android-notifications
Вопрос:
Я использую flutter_local_notifications
приложение Flutter для планирования уведомлений в определенное время.
Когда я нажимаю на уведомление, во время работы приложения оно работает должным образом и переходит на соответствующий экран; но когда уведомление нажато, когда приложение было отключено, оно переходит на главный экран вместо этого.
Поскольку это уведомление планируется автоматически, а не по действию пользователя, я делаю это в функции, а не в виджете. Итак, у меня их нет context
. Чтобы обойти это, я использую GlobalKey
тип NavigatorState
.
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
navigatorKey.currentState?.push(MaterialPageRoute(builder: (ctx) {
return Scaffold(
appBar: AppBar(
title: Text('notification clicked'),
),
);
}));
Второй подход, который я попробовал, — это использование виджета с отслеживанием состояния
class Noti extends StatefulWidget {
const Noti({Key? key}) : super(key: key);
@override
NotiState createState() => NotiState();
}
class NotiState extends State<Noti> {
@override
void initState() {
super.initState();
initNotification();
}
Future initNotification() async {
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('bolt');
final InitializationSettings initializationSettings =
InitializationSettings(android: initializationSettingsAndroid);
flutterLocalNotificationsPlugin.initialize(
initializationSettings,
onSelectNotification: selectNotification,
);
const notDetails = NotificationDetails(
android: AndroidNotificationDetails('1', 'Scheduled Review',
channelDescription: 'Review reminders at scheduled time'));
flutterLocalNotificationsPlugin.periodicallyShow(1, 'Scheduled Review',
'Every Minute', RepeatInterval.everyMinute, notDetails);
}
Future selectNotification(String? payload) async {
Navigator.push(context, MaterialPageRoute(builder: ((ctx) {
return Scaffold(
appBar: AppBar(
title: Text('notification clicked'),
),
);
})));
}
@override
Widget build(BuildContext context) {
return Container();
}
}
Этот Noti
виджет я вставил в случайное место на своей домашней странице, чтобы он initState
вызывался.
То же самое происходит и здесь; т. Е. При нажатии на уведомление, когда приложение отключено, я перенаправляюсь на главный экран, а не на экран с заголовком notification clicked
, как здесь логично. Однако, когда приложение активно, оно работает нормально. Я пробовал это в обеих версиях 8.2.0
и 9.0.0
в указанной библиотеке.
Ответ №1:
Не видел этой записки:
Примечание: начиная с версии 4.0 плагина, вызов initialize не вызовет обратный вызов onSelectNotification, когда приложение было запущено, нажав на уведомление для запуска. Используйте метод getNotificationAppLaunchDetails, доступный в плагине, если вам нужно обработать уведомление о запуске приложения, например, изменить домашний маршрут приложения для глубокой привязки.
Изменение initialRoute
на основе notificationAppLaunchDetails
решения этой проблемы.
final NotificationAppLaunchDetails? notificationAppLaunchDetails =
await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();
final didNotificationLaunchApp =
notificationAppLaunchDetails?.didNotificationLaunchApp ?? false;
final initialRoute = didNotificationLaunchApp ? '/second' : '/first';