Локальные уведомления Flutter не перенаправляются на соответствующий экран при отключении приложения

#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';