【问题标题】:Flutter : flutter_local_notifications onSelectNotification not working when app is terninatedFlutter:应用程序终止时,flutter_local_notifications onSelectNotification 不起作用
【发布时间】:2021-06-24 11:23:57
【问题描述】:

当应用程序处于前台或后台时,flutter_local_notifications 工作正常

但当应用程序终止时

onSelectNotification 没有按预期工作,而是打开了应用程序

static void initializeLocalNotification() async {
    FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
        FlutterLocalNotificationsPlugin();
    const AndroidInitializationSettings initializationSettingsAndroid =
        AndroidInitializationSettings('ic_launcher');
    final IOSInitializationSettings initializationSettingsIOS =
        IOSInitializationSettings(
      requestSoundPermission: false,
      requestBadgePermission: false,
      requestAlertPermission: false,
    );

    final InitializationSettings initializationSettings =
        InitializationSettings(
      android: initializationSettingsAndroid,
      iOS: initializationSettingsIOS,
    );
    await flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: (String payload) async {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      var res = await prefs.setString(kNotificationPayLoad, payload);
      // navigatorKey.currentState
      //     .push(MaterialPageRoute(builder: (_) => LoginScreen()));
      // navigatorKey.currentState.pop();
    });

    await flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<
            IOSFlutterLocalNotificationsPlugin>()
        ?.requestPermissions(
          alert: true,
          badge: true,
          sound: true,
        );
  }

【问题讨论】:

    标签: flutter flutter-notification


    【解决方案1】:

    上述解决方案很好。但这对我的应用程序来说还不够。我的情况是 - 单击通知后,它将重定向到详细信息页面。前台和后台工作正常,但问题出在已终止的应用程序上。所以我确实喜欢 -

    Notification_plugin.dart

    Future<void> showNotification(RemoteMessage message, [bool importance = true]) async {
        dynamic notification = message.data;
        final prefs = await SharedPreferences.getInstance();
    
        // check message ID is valid or not
        prefs.setBool('hasMsgId', message.messageId != null ? true : false);
    
        await flutterLocalNotificationsPlugin.show(
          message.hashCode,
          notification['title'],
          notification['body'],
          _setPlatFormSpecificSettings(importance),
          payload: notification['docId'],
        );
    }
    

    ItemScreen.dart

    @override
    void initState() {
      super.initState();
      _runWhileAppIsTerminated();
    }
    
    void _runWhileAppIsTerminated() async {
        var details = await notificationPlugin.flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();
        
        if (details.didNotificationLaunchApp) {
          if (details.payload != null) {
            final prefs = await SharedPreferences.getInstance();
            
            if (prefs.getBool('hasMsgId')) {
              prefs.remove('hasMsgId');
              
              if (prefs.get('authId').toString() != null) {
                Navigator.of(context).pushNamed(
                  ItemDetailsScreen.routeName,
                  arguments: details.payload,
                );
              } else {
                Navigator.of(context).pushReplacementNamed(AuthScreen.routeName);
              }
            }
          }
        }
    }
    

    我希望它对任何人都有帮助。谢谢!!!

    【讨论】:

      【解决方案2】:
      var details = await NotificationService()
          .flutterLocalNotificationsPlugin
          .getNotificationAppLaunchDetails();
      if (details.didNotificationLaunchApp) {
          print(details.payload);
      }
      

      在第一页使用此代码它可以获得通知点击的有效负载

      【讨论】:

      • 这个解决方案很好。但它不会清除最后一个有效负载,这就是为什么如果有人在终止后启动此应用程序,您将看到最后调用的有效负载。
      猜你喜欢
      • 2022-01-14
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2021-06-06
      • 2019-11-25
      • 2021-07-03
      相关资源
      最近更新 更多