首页 > 解决方案 > Flutter:如何安排通知?

问题描述

我试图用flutter_local_notification包实现通知的每日调度,但我的代码不起作用。编码:

void dailyNotification() async {
    var android = new AndroidInitializationSettings('app_icon');
    var iOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(android, iOS);
    bool response = await _flutterLocalNotificationsPlugin.initialize(initializationSettings);
    if(response == true){
      print("inside notification");
      var time = Time(23, 7, 0);
      var androidPlatformChannelSpecifics = AndroidNotificationDetails(
          'repeatDailyAtTime channel id',
          'repeatDailyAtTime channel name',
          'repeatDailyAtTime description');
      var iOSPlatformChannelSpecifics = IOSNotificationDetails();
      var platformChannelSpecifics = NotificationDetails(
          androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
      await _flutterLocalNotificationsPlugin.showDailyAtTime(
        0,
        'Hello',
        'All the best!',
        time,
        platformChannelSpecifics
      );
    }
  }

我在 中调用了这个函数initState,但是通知仍然没有出现。打印语句正在工作。而且我还在我的 AndroidManifest.xml 文件中添加了这些权限:

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WAKE_LOCK" />

我怎样才能做到这一点?

标签: androidflutterdartpush-notificationlocalnotification

解决方案


可能有几件事导致此问题:

  1. 您指定的图标名称 (app_icon) 可能与您在@drawable文件夹中提供的图标名称不同,甚至不存在。

  2. 您还必须在Manifest.

    <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
    <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
    

您需要在<activity>标签关闭后添加它们。你的清单应该是这样的:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your_package_name">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
     calls FlutterMain.startInitialization(this); in its onCreate method.
     In most cases you can leave this as-is, but you if you want to provide
     additional functionality it is fine to subclass or reimplement
     FlutterApplication and put your custom class here.-->

<!--    <uses-permission android:name="android.permission.INTERNET"/>-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE" />
<!--    <uses-permission android:name="android.permission.WAKE_LOCK" />-->


<application
    android:name="io.flutter.app.FlutterApplication"
    android:label="Application_Name"
    android:icon="@mipmap/ic_launcher">
    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">

        <meta-data
            android:name="io.flutter.embedding.android.SplashScreenDrawable"
            android:resource="@mipmap/launch_screen"
            />

        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>


    <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
    <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
    </receiver>
    <!-- Don't delete the meta-data below.
         This is used by the Flutter tool to generate GeneratedPluginRegistrant.java-->
    <meta-data
        android:name="flutterEmbedding"
        android:value="2" />
</application>


推荐阅读