Flutter:flutter

2024-04-11 1238阅读

温馨提示:这篇文章已超过385天没有更新,请注意相关的内容是否还可用!

前言

注: 刚开始学习,如果某些案例使用时遇到问题,可以自行百度、查看官方案例、官方github。

简介

Flutter Local Notifications是一个用于在Flutter应用程序中显示本地通知的插件。它提供了一个简单而强大的方法来在设备上发送通知,以便用户可以在应用程序处于后台或设备锁定状态下接收到它们。

使用Flutter Local Notifications插件,可以创建和安排各种类型的通知,包括:

  1. 即时通知:立即显示的通知,用于向用户传达重要消息或提醒。
  2. 周期性通知:可以按照指定的时间间隔重复显示的通知,例如每天或每周的提醒。
  3. 定时通知:在特定日期和时间触发的通知,用于安排未来事件或提醒。

通过使用Flutter Local Notifications,可以自定义通知的外观和行为,包括标题,内容,图标,声音,振动模式和点击操作。此外,还可以处理用户与通知的交互,例如当用户点击通知时执行特定的操作。

Flutter Local Notifications插件使用简单且易于集成到Flutter项目中。它提供了一组易于使用的API,可以轻松创建和管理通知。此外,它还兼容Android和iOS平台,并且可以在两个平台上以相同的代码库进行操作。

官方地址

https://pub-web.flutter-io.cn/packages/flutter_local_notifications

备注: 这里只学习关于安卓的基本使用

学习

准备

安装

flutter pub add flutter_local_notifications

即时通知

通知辅助类

NotificationHelper

// 导入包
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
class NotificationHelper {
  // 使用单例模式进行初始化
  static final NotificationHelper _instance = NotificationHelper._internal();
  factory NotificationHelper() => _instance;
  NotificationHelper._internal();
  // FlutterLocalNotificationsPlugin是一个用于处理本地通知的插件,它提供了在Flutter应用程序中发送和接收本地通知的功能。
  final FlutterLocalNotificationsPlugin _notificationsPlugin =
      FlutterLocalNotificationsPlugin();
  // 初始化函数
  Future initialize() async {
    // AndroidInitializationSettings是一个用于设置Android上的本地通知初始化的类
    // 使用了app_icon作为参数,这意味着在Android上,应用程序的图标将被用作本地通知的图标。
    const AndroidInitializationSettings initializationSettingsAndroid =
    AndroidInitializationSettings('@mipmap/ic_launcher');
    // 15.1是DarwinInitializationSettings,旧版本好像是IOSInitializationSettings(有些例子中就是这个)
    const DarwinInitializationSettings initializationSettingsIOS =
        DarwinInitializationSettings();
    // 初始化
    const InitializationSettings initializationSettings =
        InitializationSettings(
            android: initializationSettingsAndroid,
            iOS: initializationSettingsIOS);
    await _notificationsPlugin.initialize(initializationSettings);
  }
//  显示通知
  Future showNotification(
      {required String title, required String body}) async {
    // 安卓的通知
    // 'your channel id':用于指定通知通道的ID。
    // 'your channel name':用于指定通知通道的名称。
    // 'your channel description':用于指定通知通道的描述。
    // Importance.max:用于指定通知的重要性,设置为最高级别。
    // Priority.high:用于指定通知的优先级,设置为高优先级。
    // 'ticker':用于指定通知的提示文本,即通知出现在通知中心的文本内容。
    const AndroidNotificationDetails androidNotificationDetails =
        AndroidNotificationDetails('your.channel.id', 'your channel name',
            channelDescription: 'your channel description',
            importance: Importance.max,
            priority: Priority.high,
            ticker: 'ticker');
    // ios的通知
    const String darwinNotificationCategoryPlain = 'plainCategory';
    const DarwinNotificationDetails iosNotificationDetails =
        DarwinNotificationDetails(
      categoryIdentifier: darwinNotificationCategoryPlain, // 通知分类
    );
    // 创建跨平台通知
    const NotificationDetails platformChannelSpecifics =
        NotificationDetails(android: androidNotificationDetails,iOS: iosNotificationDetails);
    // 发起一个通知
    await _notificationsPlugin.show(
      1,
      title,
      body,
      platformChannelSpecifics,
    );
  }
}

使用

main() async {
  //用于确保Flutter的Widgets绑定已经初始化。
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化通知帮助类
  NotificationHelper notificationHelper = NotificationHelper();
  await notificationHelper.initialize();
  runApp(const MyApp());
}
class SwitcherContainerState extends State {
  final NotificationHelper _notificationHelper = NotificationHelper();
  @override
  Widget build(BuildContext context) {
    return Center(
        child: ElevatedButton(
            onPressed: () {
              _notificationHelper.showNotification(
                title: 'Hello',
                body: 'This is a notification!',
              );
            },
            child: const Text("发起通知")));
  }
}

注意:

  • 一定要在main函数里进行初始化,不然会报下面这个错误(百度了半天,最后发现是自己忘记了初始化)

    Flutter:flutter

  • 要开启应用的通知权限,不然可能无法通知

    Flutter:flutter

    周期性通知

     // 周期性通知
      Future scheduleNotification({
        required int id,
        required String title,
        required String body,
      }) async {
        const AndroidNotificationDetails androidNotificationDetails =
            AndroidNotificationDetails('your.channel.id', 'your channel name',
                channelDescription: 'your channel description',
                importance: Importance.max,
                priority: Priority.high,
                ticker: 'ticker');
        // ios的通知
        const String darwinNotificationCategoryPlain = 'plainCategory';
        const DarwinNotificationDetails iosNotificationDetails =
            DarwinNotificationDetails(
          categoryIdentifier: darwinNotificationCategoryPlain, // 通知分类
        );
        // 创建跨平台通知
        const NotificationDetails platformChannelSpecifics = NotificationDetails(
            android: androidNotificationDetails, iOS: iosNotificationDetails);
    // 发起通知
        await _notificationsPlugin.periodicallyShow(
            id, title, body, RepeatInterval.everyMinute, platformChannelSpecifics);
      }
    }
    

    这里我设置的是每分钟通知一次,注意:假如你在10:01发起了通知,10:01不会有通知消息,而是从10:02开发每隔一分钟发起一次通知。

    定时通知

    // 定时通知
    Future zonedScheduleNotification(
        {required int id,
        required String title,
        required String body,
        required DateTime scheduledDateTime}) async {
      const AndroidNotificationDetails androidNotificationDetails =
          AndroidNotificationDetails('your.channel.id', 'your channel name',
              channelDescription: 'your channel description',
              importance: Importance.max,
              priority: Priority.high,
              ticker: 'ticker');
      // ios的通知
      const String darwinNotificationCategoryPlain = 'plainCategory';
      const DarwinNotificationDetails iosNotificationDetails =
          DarwinNotificationDetails(
        categoryIdentifier: darwinNotificationCategoryPlain, // 通知分类
      );
      // 创建跨平台通知
      const NotificationDetails platformChannelSpecifics = NotificationDetails(
          android: androidNotificationDetails, iOS: iosNotificationDetails);
      // 发起通知
      await _notificationsPlugin.zonedSchedule(
        id, title, body,
        tz.TZDateTime.from(scheduledDateTime, tz.local), // 使用本地时区的时间
        platformChannelSpecifics,
        uiLocalNotificationDateInterpretation:
            UILocalNotificationDateInterpretation.absoluteTime, // 设置通知的触发时间是觉得时间
      );
    }
    

    注意:如下图参数scheduledDate是TZDateTime类型,看了一下官方示例,还需要下载timezone 库。

    timezone 是一个用来处理时区信息的,可以使得在不同平台上创建和处理日期时间对象更加方便和准确。

    官方地址

    https://pub-web.flutter-io.cn/packages/timezone

    安装

    flutter pub add timezone
    

    初始化

    就在通知辅助类NotificationHelper的initialize函数里初始化一下就行

    import 'package:timezone/timezone.dart' as tz;
    import 'package:timezone/data/latest.dart' as tz;
    //  初始化tz
    tz.initializeTimeZones();
    

    Flutter:flutter

    Flutter:flutter

    其他

    除了上面三种外还有其他的通知形式,比如(以下内容没有测试)

    长文本

    final androidPlatformChannelSpecifics = AndroidNotificationDetails(
      'channel_id',
      'channel_name',
      'channel_description',
      styleInformation: BigTextStyleInformation('大文本内容'),
    );
    

    大图片

    final androidPlatformChannelSpecifics = AndroidNotificationDetails(
      'channel_id',
      'channel_name',
      'channel_description',
      styleInformation: BigPictureStyleInformation(
        FilePathAndroidBitmap('图片路径'),
        largeIcon: FilePathAndroidBitmap('大图标路径'),
      ),
    );
    

    还有一些比如媒体样式、带进度条的等都可以在AndroidNotificationDetails找到相应的参数。

    对于IOS来说,通知样式收到苹果的限制,可以通过DarwinNotificationDetails的attachments参数来实现一些简单操作。

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]