如何使用go_router从Flutter中的OneSignal通知打开特定页面?

问题描述 投票:0回答:1

我在 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 内部实现一些侦听器并侦听某些状态,并且当用户单击通知时该状态将被更新,这是解决方案吗?

flutter push-notification onesignal flutter-go-router gorouter
1个回答
0
投票

我的主要看起来像:

 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);
      }
    });
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.