Flutter Firebase推送通知未路由到特定页面

时间:2019-05-01 13:11:12

标签: firebase flutter firebase-cloud-messaging

点击通知后,我试图导航到特定页面。当我单击通知时,将调用onResume和onMessage回调,并且可以在日志屏幕中看到该消息。但是,当我尝试导航到特定页面时,我无法执行此操作,并且日志中也没有错误消息。附言当我使用导航键访问上下文状态时(由于initState,因此无法使用导航器),我收到一条错误消息,提示没有要构建的上下文。有什么问题吗?

我尝试了Navigator.push,使用导航器键调用方法并从该方法中进行路由。

void initState() {
messaging.configure(
  onMessage: (Map<String, dynamic> message) async {
    print('onMessage: $message');
    Navigator.of(context).push(
        MaterialPageRoute<BuildContext>(builder: (_) => PageContent(value:1)));
  },
  onLaunch: (Map<String, dynamic> message) async {
    print('onLaunch: $message');
    Navigator.of(context).push(
        MaterialPageRoute<BuildContext>(builder: (_) => PageContent(value:2)));
  },
  onResume: (Map<String, dynamic> message) async {
    print('onResume:-  This is the message  $message');
    Navigator.of(context).push(
        MaterialPageRoute<BuildContext>(builder: (_) => MoviesList()));
  },
);

我希望在点击通知时加载代码并路由到新页面(在我的情况下为MoviesList或PageContent)。但是只有我的主屏幕可见。

1 个答案:

答案 0 :(得分:0)

上下文在初始化状态下不可用

我遇到了这个问题,并使用redux概念得到了解决

在全局状态下添加键,例如 appNavigator

全局应用程序状态的示例代码(app_state.dart)

import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:flutter/material.dart' hide Builder;

part 'app_state.g.dart';

abstract class AppState implements Built<AppState, AppStateBuilder> {
  factory AppState([AppStateBuilder updates(AppStateBuilder builder)]) =
      _$AppState;

  AppState._();

  static AppState initState() {
    return new AppState((AppStateBuilder b) {
      b
        ..appNavigator = new GlobalKey<NavigatorState>(debugLabel: 'debugLabel')
        .. isLoggedIn = false
        ..isLoading = false;

    });
  }

  // Never change this key through out the app lifecycle
  GlobalKey<NavigatorState> get appNavigator;

  // login state ***************************************************************************
  bool get isLoggedIn;

  // indicates loading state ***************************************************************************
  bool get isLoading;

}

对从通知之类收到的Message进行操作

onMessage: (Map<String, dynamic> message) async {
    print('onMessage: $message');
store.dispatch(new RedirectUserOnNotification());
  },

并在中间件中转到具有所需条件验证的特定页面。

void redirectuser(Store<AppState> store, RedirectUserOnNotification action,
    NextDispatcher next) async {
    store.state.appNavigator.currentState.pushNamed(someRouteName);
  next(action);
}

注意:我已经在模型文件中使用了build_value概念