繁体   English   中英

如何在 flutter 中实现本地通知?

[英]How to implement local notifications in flutter?

I want to implement local notification with FCM and this package and I implemented it like this: First: I install FCM and Flutter local notification package on my project and after that, I create an Application Kotlin class in android -> app -> src -> main ->... Application:

申请代码:

    package com.example.onion
    
    import io.flutter.app.FlutterApplication
    import io.flutter.plugin.common.PluginRegistry
    import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
    import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin
    import io.flutter.view.FlutterMain
    import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
    import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin
    
    class Application : FlutterApplication(), PluginRegistrantCallback {
    
        override fun onCreate() {
            super.onCreate()
            FlutterFirebaseMessagingService.setPluginRegistrant(this);
            FlutterMain.startInitialization(this)
        }
    
        override fun registerWith(registry: PluginRegistry?) {
            if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
                FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
            }
            if (!registry!!.hasPlugin("com.dexterous.flutterlocalnotifications")) {
                FlutterLocalNotificationsPlugin.registerWith(registry!!.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"));
            }
        }
    }

清单代码:

<application
    android:name=".Application"
    android:icon="@mipmap/ic_launcher"
    android:label="onion">

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="AIza..." />


    <activity
        android:name=".MainActivity"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:launchMode="singleTop"
        android:showWhenLocked="true"
        android:theme="@style/LaunchTheme"
        android:turnScreenOn="true"
        android:windowSoftInputMode="adjustResize">
        <meta-data
            android:name="io.flutter.embedding.android.NormalTheme"
            android:resource="@style/NormalTheme" />
        <meta-data
            android:name="io.flutter.embedding.android.SplashScreenDrawable"
            android:resource="@drawable/launch_background" />

        <intent-filter>
            <action android:name="FLUTTER_NOTIFICATION_CLICK" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.yalantis.ucrop.UCropActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    <meta-data
        android:name="flutterEmbedding"
        android:value="2" />
</application>

而且我在稳定频道上但它不起作用,我将频道更改为测试版但仍然不起作用

flutter博士:

    [√] Flutter (Channel beta, 1.24.0-10.2.pre, on Microsoft Windows [Version 10.0.14393], locale en-US)
        • Flutter version 1.24.0-10.2.pre at C:\src\flutter
        • Framework revision 022b333a08 (3 weeks ago), 2020-11-18 11:35:09 -0800
        • Engine revision 07c1eed46b
        • Dart version 2.12.0 (build 2.12.0-29.10.beta)
    
    [√] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
        • Android SDK at C:\Users\Mahdi\AppData\Local\Android\Sdk
        • Platform android-30, build-tools 30.0.2
        • ANDROID_HOME = C:\Users\Mahdi\AppData\Local\Android\Sdk
        • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
        • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
        • All Android licenses accepted.
    
    [√] Android Studio (version 4.0)
        • Android Studio at C:\Program Files\Android\Android Studio
        • Flutter plugin version 51.0.1
        • Dart plugin version 193.7547
        • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
    
    [√] VS Code (version 1.51.1)
        • VS Code at C:\Users\Mahdi\AppData\Local\Programs\Microsoft VS Code
        • Flutter extension version 3.17.0
    
    [√] Connected device (1 available)
        • Nexus 6 (mobile) • 127.0.0.1:62025 • android-x86 • Android 5.1.1 (API 22)
    
    • No issues found!

flutter pubspec.yaml文件:

      firebase_messaging: ^7.0.3
      flutter_local_notifications: ^3.0.2

main.dart代码:

    import 'package:flutter_local_notifications/flutter_local_notifications.dart';
    
      FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
          new FlutterLocalNotificationsPlugin();
      Future onSelectNotification(String payload) {
        print("Mahdi: onSelectNotification");
      }
    
      @override
      void initState() {
        super.initState();
        _fcm.getToken().then((value) => print("FCM TOKEN: $value"));
    
        var initializationSettingsAndroid =
            new AndroidInitializationSettings('@mipmap/ic_launcher');
        var initializationSettingsIOS = new IOSInitializationSettings();
        var initializationSettings = new InitializationSettings(
          android: initializationSettingsAndroid,
          iOS: initializationSettingsIOS,
        );
        flutterLocalNotificationsPlugin.initialize(
          initializationSettings,
          onSelectNotification: onSelectNotification,
        );
    
        _fcm.configure(
          onMessage: (Map<String, dynamic> message) async {
            showNotification(
              message['notification']['title'],
              message['notification']['body'],
            );
            print("onMessage: $message");
          },
          onLaunch: (Map<String, dynamic> message) async {
            print("onLaunch: $message");
            // TODO optional
            Navigator.pushNamed(
              context,
              message['data']['status'],
            );
          },
          onResume: (Map<String, dynamic> message) async {
            print("onResume: $message");
            // TODO optional
            Navigator.pushNamed(
              context,
              message['data']['status'],
            );
          },
        );
    
        if (Platform.isIOS) {
          dynamic iosSubscription = _fcm.onIosSettingsRegistered.listen((data) {});
          _fcm.requestNotificationPermissions(IosNotificationSettings());
        }
      }
    
      void showNotification(String title, String body) async {
        await _demoNotification(title, body);
      }
    
      Future<void> _demoNotification(String title, String body) async {
        var androidPlatformChannelSpecifics = AndroidNotificationDetails(
            'channel_ID', 'channel name', 'channel description',
            importance: Importance.max,
            playSound: true,
            // sound: 'sound',
            showProgress: true,
            priority: Priority.high,
            ticker: 'test ticker');
    
        var iOSChannelSpecifics = IOSNotificationDetails();
        var platformChannelSpecifics = NotificationDetails(
          android: androidPlatformChannelSpecifics,
          iOS: iOSChannelSpecifics,
        );
        await flutterLocalNotificationsPlugin
            .show(0, title, body, platformChannelSpecifics, payload: 'test');
      }

但我得到了这个错误:

    no implementation found for method show on channel dexterous.com/flutter/local_notifications

我在谷歌上搜索了很多,我发现了一些类似的问题 但这对我不起作用。

在需要 Android 的平台特定代码的 SDK 的旧版本上出现错误"no implementation found for method show on channel dexterous.com..." 如本指南中所述,如果您使用的是最新的 Flutter SDK 版本和firebase_messaging package,则无需执行这些步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM