单击通知时,我正试图导航到特定页面。当我点击通知时,onResume和onMessage回调会被调用,我可以在日志屏幕中看到消息。但是,当我尝试导航到特定页面时,我无法做到这一点,日志中也没有错误消息。附言:当我使用Navigator键访问上下文的状态时(因为在initState中,不能使用Navigator),我收到一个错误,说没有要构建的上下文。错在哪里??
我试过Navigator.push,调用一个方法并从该方法中路由,使用了Navigator键。
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)时加载代码。但只有我的主屏幕是可见的。
上下文在初始状态中不可用
我遇到了这个问题,并使用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;
}
调度从等通知中接收到的操作onMessage
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概念