【发布时间】:2019-10-08 20:11:09
【问题描述】:
我目前正在努力让通知按照我希望的方式在 Flutter 上运行。 我目前的解决方案是有一个动态的 LandingPage,它 - 取决于 FirebaseAuth - 重定向到登录或主屏幕。
MaterialApp(
theme: ThemeData(
...
home: Scaffold(body: Builder(builder: (context) => LandingPage()))
),
在 LandingPage 中,我将在我的 Singleton 中调用一个函数来为我设置通知。如您所见,我在这里传递上下文。这是因为我想从通知的 onMessage 回调中显示 Snackbar。
class LandingPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
FirebaseUser user = Provider.of<FirebaseUser>(context);
if (user != null) {
Singleton().setupMessaging(user.uid, context); //This is the line
return MainPage(userId: user.uid);
} else {
while(Navigator.canPop(context)){
Navigator.pop(context);
}
return LoginPage();
}
}
}
通过我试图实现的目标,在用户登录后让消息传递系统运行。我只在当前令牌未定义时设置回调。
我现在遇到的问题是,所说的上下文不是应用程序范围的,这意味着,一旦我导航到一个新的 Widget,它有自己的上下文,Snackbar 就不能再显示了。现在我不确定这是否是初始化消息传递的正确位置,因为没有应用程序范围的上下文。
setupMessaging(String uid) async{
if((await SharedPreferences.getInstance()).getBool('bNotifications') ?? true){
print("bNotifications disabled");
return;
}
_firebaseMessaging.getToken().then((token) {
if (_lastToken != token) {
if (_lastToken == null) {
if (Platform.isIOS) iOSPermission();
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print('onMessage $message');
Scaffold.of(context).showSnackBar(...); //Here I need the context
},
onResume: (Map<String, dynamic> message) async {
print('onResume $message');
},
onLaunch: (Map<String, dynamic> message) async {
print('onLaunch $message');
},
);
}
_lastToken = token;
}
});
}
我还考虑在 onMessage-callback 中显示本地通知,但本地通知和 firebase-messaging 在 iOS 上不能一起使用。
我听说的最后一个选项是使用 GlobalKey,我需要通过我的所有页面。我听说这种方法也很慢。
【问题讨论】:
标签: flutter push-notification google-cloud-messaging