Флаттер: локальный плагин уведомлений, переход к конкретному экрану, когда пользователь нажимает на уведомление - PullRequest
0 голосов
/ 11 января 2019

Я использую плагин локальных уведомлений, и все работает нормально, за исключением того, что когда я нажимаю на уведомление. Я хочу перейти к определенному экрану, когда пользователь нажимает на уведомление

Future onSelectNotification(String payload) async {
    //convert payload json to notification model object
    try{
    Map notificationModelMap = jsonDecode(payload);
    NotificationModel model = NotificationModel.fromJson(notificationModelMap);

    await Navigator.push(
        context,// it`s null!
        new MaterialPageRoute(
            builder: (context) => CommitmentPage(model)));}
            catch(e){print(e.toString());}
  }

но контекст всегда нулевой и дает мне исключение NoSuchMethodError: The method 'ancestorStateOfType' was called on null.

Редактировать

Я попытался использовать navigatorKey и передать его в приложение для материалов, как предложено @ Günter Zöchbauer, но это дает мне еще одно исключение

Navigator operation requested with a context that does not include a Navigator.
The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget

main.dart

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

static final navigatorKey = new GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      navigatorKey:navigatorKey ,
      title: 'notification',
      theme: ThemeData(
        primarySwatch: Colors.purple,
      ),
      home: new RootPage(auth: new Auth(),),
    );
  }

}

ReminderPage

   class ReminderPage extends StatefulWidget {

    @override
      _ReminderPageState createState() => _ReminderPageState();

    }

class _ReminderPageState extends State<ReminderPage> {
  final flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
....

 @override
  void initState() {
    super.initState();

    _initLocalNotification();
....

  }


// this method is called when u tap on the notification
 Future onSelectNotification(String payload) async {

    //convert payload json to notification model object
    Map notificationModelMap = jsonDecode(payload);
    NotificationModel model = NotificationModel.fromJson(notificationModelMap);

    try{
   await Navigator.push(
        MyApp.navigatorKey.currentState.context,
        new MaterialPageRoute(
            builder: (context) => CommitmentPage(model)));}
            catch(e){print(e.toString());}


  }

}

Редактировать 2 вместо использования

 await Navigator.push(
            MyApp.navigatorKey.currentState.context,
            new MaterialPageRoute(
                builder: (context) => CommitmentPage(model)));}
                catch(e){print(e.toString());}

я использовал

await  MyApp.navigatorKey.currentState.push(MaterialPageRoute(builder: (context) => CommitmentPage(model)));

и все работало нормально, но когда я нажимаю на уведомление после уничтожения приложения, я перехожу на домашнюю страницу, а не на нужную! я думаю, что navigatorKey еще не инициализирован!

Ответы [ 2 ]

0 голосов
/ 12 января 2019

С последними внесенными вами изменениями вы попадаете на домашнюю страницу, и это больше связано с тем, что вы создаете и инициализируете плагин еще на нескольких страницах в своем приложении. учитывая, что приложение было убито, плагин тоже был бы убит. Вы должны изучить инициализацию плагина ближе к моменту запуска вашего приложения, например. примерно при создании приложения или при создании первой страницы, в зависимости от желаемого поведения. В этом выпуске https://github.com/MaikuB/flutter_local_notifications/issues/99, другой разработчик смог изменить первую отображаемую страницу, если приложение убито, но это может отличаться от того, что вы хотите.

0 голосов
/ 11 января 2019

Передайте navigatorKey в MaterialApp и используйте этот ключ, чтобы получить контекст. Этот контекст содержит Navigator, и вы можете использовать его для переключения на любую нужную страницу.

https://docs.flutter.io/flutter/material/MaterialApp/navigatorKey.html

...