【问题标题】:Flutter local notification onSelectNotification can not open a new page when a local notification is clickedFlutter 本地通知 onSelectNotification 点击​​本地通知时无法打开新页面
【发布时间】:2020-01-12 05:58:54
【问题描述】:

我希望我的 Flutter 应用在​​单击本地通知时打开一个页面。我在事件监听器中定义了以下代码:

Navigator.push(
   Ccontext,
   MaterialPageRoute(builder: (context) => PendingOrders()),
 );
debugPrint('notification payload: ' + payload);

事件监听器执行成功,并在调用本地通知时打印 debugPrint 的参数,但无法打开 PendingOrders 路由。

这是 main.dart 中的完整代码

  class _MyAppState extends State<MyApp> {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
@override
void initState() {
  super.initState();

  var android = AndroidInitializationSettings('mipmap/ic_launcher');
  var ios =  IOSInitializationSettings();
  var platform = InitializationSettings(android, ios);
  flutterLocalNotificationsPlugin.initialize(platform,onSelectNotification: onSelectNotification);

  _firebaseMessaging.subscribeToTopic('order-created');
  _firebaseMessaging.configure(
    onMessage: (Map<String, dynamic> message) async {
      print("onMessage: $message");
      showNotification(message);
    },
    onLaunch: (Map<String, dynamic> message) async {
      print("onLaunch: $message");
      print("Hafijur");
    },
    onResume: (Map<String, dynamic> message) async {
      print("onResume: ${message['notification']['data']['click_action']}");
    },
  );
  _firebaseMessaging.requestNotificationPermissions(
      const IosNotificationSettings(sound: true, badge: true, alert: true));
}

showNotification(Map<String, dynamic> msg) async {
  var android = new AndroidNotificationDetails(
    'sdffds dsffds',
    "CHANNLE NAME",
    "channelDescription",
  );
  var iOS = new IOSNotificationDetails();
  var platform = new NotificationDetails(android, iOS);
  await flutterLocalNotificationsPlugin.show(
      0, "New order arrived", "Hey, hurry up! you have a order to deliver", platform,payload: "order created");
}
 Future onSelectNotification(String payload) async {
  this.build(context);
   Navigator.push(
     context,
     MaterialPageRoute(builder: (context) => PendingOrders()),
   );
   if (payload != null) {
    debugPrint('notification payload: ' + payload);
  }
}

@override
Widget build(BuildContext context) {
  return MaterialApp(
    title: 'Flutter Demo',
    theme: Constants.lightTheme,
    debugShowCheckedModeBanner: false,
    routes: {
      "/": (context) => MainScreen(),
      "/login": (context) => LoginPage(),
      "/dashboard": (context) => Dashboard(),
      "/all_orders": (context) => AllOrders(),
      "/pending_orders": (context) => PendingOrders(),
      "/delivered_orders": (context) => DeliveredOrders(),
      "/order": (context) => Order(),
    },
  );
}
}

【问题讨论】:

  • 面临同样的问题
  • onSelectNotification 不工作如果应用程序关闭任何希望??

标签: android ios flutter dart


【解决方案1】:

要在点击通知打开后关闭应用程序时接收有效负载,那么您必须使用 getNotificationAppLaunchDetails 方法

final NotificationAppLaunchDetails? notificationAppLaunchDetails =
await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();
String? payload = notificationAppLaunchDetails!.payload;

将此代码放在通知初始化行之后

只有在点击通知时应用已经打开时才会触发使用onSelectNotification

但如果应用程序已经关闭,并且您想在点击通知并处理有效负载值后运行它,那么您必须使用 getNotificationAppLaunchDetails

代码如下:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  var initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  var initializationSettingsIOs = IOSInitializationSettings();
  var initSetttings = InitializationSettings(
      android: initializationSettingsAndroid, iOS: initializationSettingsIOs);
  var cnf = await flutterLocalNotificationsPlugin.initialize(initSetttings,
      onSelectNotification: onSelectNotification);
  final NotificationAppLaunchDetails? notificationAppLaunchDetails =
      await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();

  print('payload=');
  String? payload= notificationAppLaunchDetails!.payload;
  print(payload);

    runApp(
         MaterialApp(        
          home: payload== 'page1' ? Page1() : MainPage()
         )
       ); 
}

【讨论】:

  • 确实是非常好的提示,它帮助了我并解决了我的问题
  • 但是如果我们想在应用终止时点击通知打开应用,那该怎么办?
【解决方案2】:

我遇到了类似的问题,但这解决了我的问题

    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) {
        displayNotification(message);
        return;
      },
      onResume: (Map<String, dynamic> message) {
        _navigateToItemDetail(message);
        return;
      },
      onLaunch: (Map<String, dynamic> message) {
        _navigateToItemDetail(message);
        return;
      },
    );
void _navigateToItemDetail(Map<String, dynamic> message) async {
    Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
    await Navigator.of(context).push(PageRouteBuilder(
        opaque: false, pageBuilder: (context, _, __) => NewPage();

  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多