我在 Flutter App 中使用 go_router 包进行路由。我们使用 OneSignal 进行通知。当用户尝试打开通知时,我正在使用此处理程序
OneSignal.shared.setNotificationOpenedHandler(
(OSNotificationOpenedResult result) {
OSNotification payload = result.notification;
print('"OneSignal: notification opened: ${result}');
});
我尝试了其他答案的解决方案,但它不起作用。我的第一个问题是,将此代码放在应用程序中的哪里,我需要将其放在 main function 中还是放在 Material App 中?
MaterialApp.router(
routerConfig: router,
),
这种情况下如何打开特定页面?我是否需要在 go_router 内部实现一些侦听器并侦听某些状态,并且当用户单击通知时该状态将被更新,这是解决方案吗?
我的主要看起来像:
class MyApp extends ConsumerStatefulWidget {
const MyApp({super.key});
@override
ConsumerState<MyApp> createState() => _MyAppState();
}
class _MyAppState extends ConsumerState<MyApp> {
@override
Widget build(BuildContext context) {
print('User: ${ref.watch(userDataProvider)?.data?.email}');
print(
'Role: ${Roles.roleChecker(ref.read(userDataProvider)?.data?.roles) ?? ""}');
print(
'Token: ${ref.watch(sharedPreferencesProvider)?.getString(SharedPreferencesNames.token.name)}');
print('User ID: ${ref.watch(userDataProvider)?.data?.id}');
print(
"device id: ${ref.watch(sharedPreferencesProvider)?.getString(SharedPreferencesNames.deviceid.name)}");
var router = ref.read(routing);
//CALLS HERE....
OneSignalWapper.handleClickNotification(ref, router);
return MaterialApp.router(
debugShowCheckedModeBanner: false,
themeMode: ref.watch(themeProvider),
theme: MyThemes.lightTheme,
darkTheme: MyThemes.darkTheme,
title: 'Flutter Demo',
routeInformationParser: router.routeInformationParser,
routerDelegate: router.routerDelegate,
routeInformationProvider: router.routeInformationProvider,
);
}
}
然后我创建了一个自定义 OneSignal 包装文件,如下所示:
class OneSignalWapper {
static void handleClickNotification(WidgetRef ref, GoRouter router) {
OneSignal.shared.setNotificationOpenedHandler(
(OSNotificationOpenedResult result) async {
print("object");
// OSNotification payload = result.notification;
switch (ref.watch(userDataProvider)?.data?.accountType) {
case Roles.user:
router.pushNamed(RouteNames.userPushNotifications.name);
break;
case Roles.admin:
router.pushNamed(RouteNames.adminHomePage.name);
break;
case Roles.assistant:
router.pushNamed(RouteNames.assistantHomePage.name);
break;
default:
router.pushNamed(RouteNames.login.name);
}
});
}
}