点击通知后,我试图导航到特定页面。当我单击通知时,将调用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)。但是只有我的主屏幕可见。
答案 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概念