面试题答案
一键面试实现思路
- 依赖库:使用
flutter_local_notifications
库来管理通知,device_info_plus
库来获取设备信息判断当前运行平台。 - 创建通知:使用
flutter_local_notifications
创建通知。 - 平台判断:通过
device_info_plus
获取设备信息,判断是 iOS 还是 Android 平台。 - 点击通知跳转:根据平台判断结果,在点击通知时进行不同页面的跳转。
核心代码
- 添加依赖:
dependencies:
flutter_local_notifications: ^13.0.0
device_info_plus: ^9.0.0
- 初始化通知:
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);
}
- 发送通知:
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: '点击通知的附加数据',
);
}
- 处理通知点击:
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()),
);
}
}
- 注册通知点击回调:
flutterLocalNotificationsPlugin.setOnNotificationTapForeground((NotificationResponse details) {
handleNotificationTap(details.payload);
return Future<void>.value();
});
其中 PageA
和 PageB
是自定义的需要跳转的页面,navigatorKey
是用于导航的 GlobalKey<NavigatorState>
。