Flutter: как запланировать уведомления? - PullRequest
0 голосов
/ 05 мая 2020

Я пытался реализовать ежедневное расписание уведомлений с помощью пакета 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" />

Как я могу этого добиться?

1 Ответ

0 голосов
/ 25 мая 2020

Может быть несколько причин, вызывающих эту проблему:

  1. Указанное вами имя значка (app_icon) может не совпадать с именем значка, которое вы указали в папке @drawable или даже не существует.

  2. Вы также должны добавить эти 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>

...