当前位置: 首页> 汽车> 报价 > ui中国设计网_中山seo外包_如何自建网站?_广州aso优化公司 有限公司

ui中国设计网_中山seo外包_如何自建网站?_广州aso优化公司 有限公司

时间:2025/7/9 15:59:17来源:https://blog.csdn.net/weixin_43575775/article/details/145585546 浏览次数: 0次
ui中国设计网_中山seo外包_如何自建网站?_广州aso优化公司 有限公司

flutter_local_notifications

效果

安卓配置(AndroidManifest.xml)

    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

可参考下面

<manifest xmlns:android="http://schemas.android.com/apk/res/android"><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /><uses-permission android:name="com.android.alarm.permission.SET_ALARM"/><uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /><uses-permission android:name="android.permission.POST_NOTIFICATIONS"/><applicationandroid:label="whisp"android:name="${applicationName}"android:icon="@mipmap/launcher_icon"><activityandroid:name=".MainActivity"android:exported="true"android:launchMode="singleTop"android:taskAffinity=""android:theme="@style/LaunchTheme"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:windowSoftInputMode="adjustResize"><!-- Specifies an Android theme to apply to this Activity as soon asthe Android process has started. This theme is visible to the userwhile the Flutter UI initializes. After that, this theme continuesto determine the Window background behind the Flutter UI. --><meta-dataandroid:name="io.flutter.embedding.android.NormalTheme"android:resource="@style/NormalTheme"/><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><!-- Don't delete the meta-data below.This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --><meta-dataandroid:name="flutterEmbedding"android:value="2" /></application><!-- Required to query activities that can process text, see:https://developer.android.com/training/package-visibility andhttps://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --><queries><intent><action android:name="android.intent.action.PROCESS_TEXT"/><data android:mimeType="text/plain"/></intent></queries>
</manifest>

ios配置AppDelegate.swift(参考下面)

import flutter_local_notifications

 FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
        GeneratedPluginRegistrant.register(with: registry)
    }

if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}

 (参考下面)

import UIKit
import Flutter
import flutter_local_notifications@main
@objc class AppDelegate: FlutterAppDelegate {override func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// This is required to make any communication available in the action isolate.FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) inGeneratedPluginRegistrant.register(with: registry)}if #available(iOS 10.0, *) {UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate}GeneratedPluginRegistrant.register(with: self)return super.application(application, didFinishLaunchingWithOptions: launchOptions)}
}

封装类

import 'dart:async';
import 'dart:io';import 'package:flutter_local_notifications/flutter_local_notifications.dart';@pragma('vm:entry-point')
void notificationTapBackground(NotificationResponse notificationResponse) {// ignore: avoid_printprint('notification(${notificationResponse.id}) action tapped: ''${notificationResponse.actionId} with'' payload: ${notificationResponse.payload}');if (notificationResponse.input?.isNotEmpty ?? false) {// ignore: avoid_printprint('notification action tapped with input: ${notificationResponse.input}');}
}class NotificationHelper {static NotificationHelper? _instance;static NotificationHelper getInstance() {_instance ??= NotificationHelper._initial();return _instance!;}factory NotificationHelper() => _instance ??= NotificationHelper._initial();//创建命名构造函数NotificationHelper._initial() {initialize();}// FlutterLocalNotificationsPlugin实例final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin();final StreamController<NotificationResponse> selectNotificationStream = StreamController<NotificationResponse>.broadcast();// 常量定义static const String _channelId = 'message_notifications';static const String _channelName = 'message notification';static const String _channelDescription = 'Notifications for receiving new messages';static const String _ticker = 'ticker';static const String _darwinNotificationCategoryPlain = 'plainCategory';static const String darwinNotificationCategoryText = 'textCategory';int id = 0;bool _notificationsEnabled = false;// 初始化通知插件Future<void> initialize() async {try {const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/launcher_icon');const DarwinInitializationSettings initializationSettingsIOS =DarwinInitializationSettings(requestSoundPermission: false, requestBadgePermission: false, requestAlertPermission: false);const InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid,iOS: initializationSettingsIOS,);await _notificationsPlugin.initialize(initializationSettings,onDidReceiveNotificationResponse: selectNotificationStream.add,onDidReceiveBackgroundNotificationResponse: notificationTapBackground,);} catch (e) {print('初始化通知插件失败: $e');}}initPermission() {_isAndroidPermissionGranted();_requestPermissions();_configureSelectNotificationSubject();}closeSubject() {selectNotificationStream.close();}Future<void> _isAndroidPermissionGranted() async {if (Platform.isAndroid) {final bool granted =await _notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.areNotificationsEnabled() ??false;_notificationsEnabled = granted;}}Future<void> _requestPermissions() async {if (Platform.isIOS) {await _notificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(alert: true,badge: true,sound: true,);} else if (Platform.isAndroid) {final AndroidFlutterLocalNotificationsPlugin? androidImplementation =_notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>();final bool? grantedNotificationPermission = await androidImplementation?.requestNotificationsPermission();_notificationsEnabled = grantedNotificationPermission ?? false;}}void _configureSelectNotificationSubject() {selectNotificationStream.stream.listen((NotificationResponse? response) async {// await Navigator.of(context).push(MaterialPageRoute<void>(//   builder: (BuildContext context) =>//       SecondPage(response?.payload, data: response?.data),// ));print("点击消息携带的数据$response");});}// 显示通知Future<void> showNotification({required String title, required String body, String payload = ""}) async {const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(_channelId,_channelName,channelDescription: _channelDescription,importance: Importance.max,priority: Priority.high,ticker: _ticker,);const DarwinNotificationDetails iosNotificationDetails = DarwinNotificationDetails(categoryIdentifier: _darwinNotificationCategoryPlain);const NotificationDetails notificationDetails = NotificationDetails(android: androidNotificationDetails, iOS: iosNotificationDetails);await _notificationsPlugin.show(id++,title,body,notificationDetails,payload: payload,);}/// 取消全部通知cancelAll() {_notificationsPlugin.cancelAll();}/// 取消对应ID的通知cancelId(int id) {_notificationsPlugin.cancel(id);}
}

使用

main方法中初始化

NotificationHelper.getInstance().initialize();

首页中进行权限和方法回调绑定和卸载

首页的instate
NotificationHelper.getInstance().initPermission();

首页的dispose

NotificationHelper.getInstance().closeSubject();

调用提示 接收消息直接调用

NotificationHelper.getInstance().showNotification(title: "科学研究", body: "研究开始了", payload: "payload");

这里可以监控点击推送后动作,如跳转页面  response?.data 是携带的数据

 void _configureSelectNotificationSubject() {selectNotificationStream.stream.listen((NotificationResponse? response) async {// await Navigator.of(context).push(MaterialPageRoute<void>(//   builder: (BuildContext context) =>//       SecondPage(response?.payload, data: response?.data),// ));print("点击消息携带的数据$response");});}

关键字:ui中国设计网_中山seo外包_如何自建网站?_广州aso优化公司 有限公司

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: