gpt4 book ai didi

flutter - 在 Flutter 中初始化通知的正确位置

转载 作者:IT王子 更新时间:2023-10-29 06:33:22 30 4
gpt4 key购买 nike

我目前正在努力让通知按照我希望的方式在 Flutter 上运行。我目前的解决方案是拥有一个动态的登陆页面,它根据 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();
}
}
}

我正在努力实现这一点,即在用户登录后让消息传递系统运行。我只在当前 token 未定义时设置回调。

我现在遇到的问题是,所说的上下文不是应用程序范围的,这意味着,一旦我导航到一个新的 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 回调中显示本地通知,但本地通知和 firebase 消息在 iOS 上不能一起工作。

我听说的最后一个选项是使用 GlobalKey,我需要通过我的所有页面传递它。据我所知,这种方法也很慢。

最佳答案

没有应用程序范围的 Context 这样的东西,但是您可以为您的 Snackbars 创建一个应用程序范围的Scaffold

初始化一个可以静态访问的GlobalKey。必须在构建任何路由之前对其进行初始化,例如。在您的应用程序的 main() 函数中,或在返回 MaterialApp 的小部件的状态中:

static final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();

将构建器添加到您的 MaterialApp,它用 Scaffold 包装每个页面:

builder: (BuildContext context, Widget child) {
return Scaffold(
key: scaffoldKey,
body: child,
);
}

现在您不再需要特定于页面的 Context,因为您可以使用顶级 Scaffold 来显示 Snackbars:

MyAppState.scaffoldKey.currentState.showSnackBar(...)

关于flutter - 在 Flutter 中初始化通知的正确位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56255110/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com