MST

星途 面试题库

面试题:Flutter 实现 iOS 和 Android 通知交互逻辑差异处理

假设应用中有一个通知,点击通知后在 iOS 上需要跳转到特定页面 A,在 Android 上需要跳转到特定页面 B,使用 Flutter 如何实现这种因平台不同而产生的通知交互逻辑差异,详细说明实现思路及核心代码。
50.2万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 依赖库:使用 flutter_local_notifications 库来管理通知,device_info_plus 库来获取设备信息判断当前运行平台。
  2. 创建通知:使用 flutter_local_notifications 创建通知。
  3. 平台判断:通过 device_info_plus 获取设备信息,判断是 iOS 还是 Android 平台。
  4. 点击通知跳转:根据平台判断结果,在点击通知时进行不同页面的跳转。

核心代码

  1. 添加依赖
dependencies:
  flutter_local_notifications: ^13.0.0
  device_info_plus: ^9.0.0
  1. 初始化通知
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

Future<void> initNotifications() async {
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  const DarwinInitializationSettings initializationSettingsDarwin =
      DarwinInitializationSettings();
  const InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    iOS: initializationSettingsDarwin,
  );
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
  1. 发送通知
Future<void> showNotification() async {
  const AndroidNotificationDetails androidPlatformChannelSpecifics =
      AndroidNotificationDetails(
    'your channel id',
    'your channel name',
    importance: Importance.max,
    priority: Priority.high,
  );
  const DarwinNotificationDetails iOSPlatformChannelSpecifics =
      DarwinNotificationDetails();
  const NotificationDetails platformChannelSpecifics = NotificationDetails(
    android: androidPlatformChannelSpecifics,
    iOS: iOSPlatformChannelSpecifics,
  );
  await flutterLocalNotificationsPlugin.show(
    0,
    '通知标题',
    '通知内容',
    platformChannelSpecifics,
    payload: '点击通知的附加数据',
  );
}
  1. 处理通知点击
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/material.dart';

void handleNotificationTap(String? payload) async {
  final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
  if (Theme.of(navigatorKey.currentContext!).platform == TargetPlatform.iOS) {
    // iOS 平台跳转到页面 A
    Navigator.push(
      navigatorKey.currentContext!,
      MaterialPageRoute(builder: (context) => PageA()),
    );
  } else {
    // Android 平台跳转到页面 B
    Navigator.push(
      navigatorKey.currentContext!,
      MaterialPageRoute(builder: (context) => PageB()),
    );
  }
}
  1. 注册通知点击回调
flutterLocalNotificationsPlugin.setOnNotificationTapForeground((NotificationResponse details) {
  handleNotificationTap(details.payload);
  return Future<void>.value();
});

其中 PageAPageB 是自定义的需要跳转的页面,navigatorKey 是用于导航的 GlobalKey<NavigatorState>