Сбой приложения Flutter при использовании push-уведомлений firebase

#flutter #dart #firebase-cloud-messaging #androidx

#flutter #dart #firebase-облако-обмен сообщениями #androidx

Вопрос:

Я хочу показывать push-уведомления с помощью функций firebase в моем приложении flutter. Но каждый раз, когда отправляется уведомление, мое приложение выходит из строя.

Вот мой код для push-уведомлений, я пытаюсь показать его на панели закусок

 import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttershare/models/user.dart';
import 'package:fluttershare/pages/activity_feed.dart';
import 'package:fluttershare/pages/create_account.dart';
import 'package:fluttershare/pages/profile.dart';
import 'package:fluttershare/pages/search.dart';
import 'package:fluttershare/pages/timeline.dart';
import 'package:fluttershare/pages/upload.dart';
import 'package:google_sign_in/google_sign_in.dart';

final GoogleSignIn googleSignIn = GoogleSignIn();
final StorageReference storageref = FirebaseStorage.instance.ref();
final usersRef = Firestore.instance.collection('users');
final postsRef = Firestore.instance.collection('posts');
final commentsRef = Firestore.instance.collection('comments');
final activityRef = Firestore.instance.collection('feed');
final followersRef = Firestore.instance.collection('followers');
final followingRef = Firestore.instance.collection('following');
final timelineRef = Firestore.instance.collection('timeline');
final DateTime timestamp = DateTime.now();
User currentUser;


class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}


class _HomeState extends State<Home> {
  final _scaffoldKey = GlobalKey<ScaffoldState>();
  FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
  bool isAuth = false;
  PageController pageController;
  int pageIndex = 0;

  @override
  void initState(){

    super.initState();

    pageController = PageController();


    googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {

      handleSignIn(account);

    }, onError: (err){

      print('Error Signing In!: $err');

    });

    googleSignIn.signInSilently(suppressErrors: false).then((account){

      handleSignIn(account);

      }).catchError((err){
      print('Error Signing In!: $err');
    });
  }

  handleSignIn(GoogleSignInAccount account) async{
    if(account!= null){
      await createUserInFirestore();
      setState(() {
        isAuth = true;
      });
      configurePushNotifications();
    }

    else{
      setState(() {
        isAuth = false;
      });
    }
  }

  configurePushNotifications() {
    final GoogleSignInAccount user = googleSignIn.currentUser;
    if (Platform.isIOS) {getIOSPermission();}

    _firebaseMessaging.getToken().then((token) {
      print('MToken: $token');
      usersRef
          .document(user.id)
          .updateData({'androidNotificationToken': token});
    });

    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print('onmessage: $message');
        final String recipientId = message['data']['recipient'];
        final String body = message['notification']['body'];

        if (recipientId == currentUser.id) {
          print('Notified');
          SnackBar snackBar = SnackBar(
            content: Text(
              body,
              overflow: TextOverflow.ellipsis,
            ),
          );
          _scaffoldKey.currentState.showSnackBar(snackBar);
        }
        print('Not notified');
      },
    );
  }

  getIOSPermission() {
    _firebaseMessaging.requestNotificationPermissions(
        IosNotificationSettings(alert: true, sound: true, badge: true));
    _firebaseMessaging.onIosSettingsRegistered.listen((settings) {
      print('settings configured $settings');
    });
  }
  createUserInFirestore() async{
    final GoogleSignInAccount user = googleSignIn.currentUser;
    DocumentSnapshot doc = await usersRef.document(user.id).get();

    if(!doc.exists){
     final username = await Navigator.push(context, MaterialPageRoute(builder: (context) => CreateAccount()));
     usersRef.document(user.id).setData({
       'id': user.id,
       'username' : username,
       'photoUrl' : user.photoUrl,
       'email' : user.email,
       'displayName' : user.displayName,
       'bio' : '',
       'timestamp' : timestamp,
       });
     
          await followersRef
          .document(user.id)
          .collection('userFollowers')
          .document(user.id)
          .setData({});
          doc = await usersRef.document(user.id).get();
    }
          currentUser =  User.fromDocument(doc);
            print(currentUser);
          print(currentUser.displayName);
  } 

  @override
  void dispose(){
    pageController.dispose();
    super.dispose();
  }

  login(){
    googleSignIn.signIn();
  }

  logout(){
    googleSignIn.signOut();
  }

  onPageChanged(int pageIndex){
    setState(() {
      this.pageIndex = pageIndex;
    });
  }

  onTap(int pageIndex){
    pageController.animateToPage(pageIndex, duration: Duration(milliseconds: 300), curve: Curves.easeInOut);
  }

  Scaffold buildAuthScreen(){
    return Scaffold(
      key: _scaffoldKey,
      body: PageView(
        children: <Widget>[
          Timeline(currentUser: currentUser,),
          ActivityFeed(),
          Upload(currentUser: currentUser),
          Search(),
          Profile(profileId: currentUser?.id),
        ],
        controller: pageController,
        onPageChanged: onPageChanged,
        physics: NeverScrollableScrollPhysics(),
      ),
      bottomNavigationBar: CupertinoTabBar(
        currentIndex: pageIndex,
        onTap: onTap,
        activeColor: Theme.of(context).primaryColor,
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.whatshot)),
          BottomNavigationBarItem(icon: Icon(Icons.favorite)),
          BottomNavigationBarItem(icon: Icon(Icons.photo_camera,size: 35.0,)),
          BottomNavigationBarItem(icon: Icon(Icons.search)),
          BottomNavigationBarItem(icon: Icon(Icons.account_circle)),
        ],
      ),
    );
    /*return RaisedButton(
      child: Text('Logout'),
      onPressed: logout,*//*
    );*/
  }

  Scaffold buildUnAuthScreen(){
    return Scaffold(
      bottomNavigationBar: BottomAppBar(
        color: Colors.deepPurple,
        child: Text("2020 © Rinkumoni Khanikar", style: TextStyle(color: Colors.white,fontSize: 20.0,),textAlign: TextAlign.center,),
        elevation: 0,
      ),
      body: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topRight,
            end: Alignment.bottomLeft,
            colors: [
              Theme.of(context).accentColor,
              Theme.of(context).primaryColor,
            ]
          ),
        ),
        alignment: Alignment.center,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Text('FriendsHive',
            style: TextStyle(
              fontFamily: 'Signatra',
              fontSize: 90.0,
              color: Colors.white,
            ) ,
            ),
            GestureDetector(
              onTap: login,
              child: Container(
                width: 260.0,
                height: 60.0,
                decoration: BoxDecoration(
                  image: DecorationImage(image: AssetImage('assets/images/google_signin_button.png'),
                    fit: BoxFit.cover,
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }



  @override
  Widget build(BuildContext context) {
    return isAuth ? buildAuthScreen() : buildUnAuthScreen();
  }
}
  

Журнал ошибок

 I/flutter (26074): MToken: c5kWogEMjaM:APA91bEb31vFm6DVfvB_ZthTR3MLHe0TJIGdrhGhEU644Ld4MCGLb7zQt4hbzp4uo3_IZxN4Zru_lsW-4mjYucEyrqL4o7ScKHJ53Da1LAoCuu1m2J4JAKDvMyP3T11kCExU6PsYfwWK
I/flutter (26074): MToken: c5kWogEMjaM:APA91bEb31vFm6DVfvB_ZthTR3MLHe0TJIGdrhGhEU644Ld4MCGLb7zQt4hbzp4uo3_IZxN4Zru_lsW-4mjYucEyrqL4o7ScKHJ53Da1LAoCuu1m2J4JAKDvMyP3T11kCExU6PsYfwWK
D/AndroidRuntime(26074): Shutting down VM
E/AndroidRuntime(26074): FATAL EXCEPTION: main
E/AndroidRuntime(26074): Process: com.rinku.friendshive, PID: 26074
E/AndroidRuntime(26074): java.lang.RuntimeException: Unable to instantiate receiver com.google.firebase.iid.FirebaseInstanceIdReceiver: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.iid.FirebaseInstanceIdReceiver" on path: DexPathList[[zip file "/data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/base.apk"],nativeLibraryDirectories=[/data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/lib/arm64, /data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/product/lib64]]
E/AndroidRuntime(26074):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:3832)
E/AndroidRuntime(26074):    at android.app.ActivityThread.access$1500(ActivityThread.java:224)
E/AndroidRuntime(26074):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1898)
E/AndroidRuntime(26074):    at android.os.Handler.dispatchMessage(Handler.java:107)
E/AndroidRuntime(26074):    at android.os.Looper.loop(Looper.java:224)
E/AndroidRuntime(26074):    at android.app.ActivityThread.main(ActivityThread.java:7560)
E/AndroidRuntime(26074):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(26074):    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
E/AndroidRuntime(26074):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
E/AndroidRuntime(26074): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.iid.FirebaseInstanceIdReceiver" on path: DexPathList[[zip file "/data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/base.apk"],nativeLibraryDirectories=[/data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/lib/arm64, /data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/product/lib64]]
E/AndroidRuntime(26074):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:230)
E/AndroidRuntime(26074):    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
E/AndroidRuntime(26074):    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
E/AndroidRuntime(26074):    at android.app.AppComponentFactory.instantiateReceiver(AppComponentFactory.java:110)
E/AndroidRuntime(26074):    at androidx.core.app.CoreComponentFactory.instantiateReceiver(CoreComponentFactory.java:60)
E/AndroidRuntime(26074):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:3825)
E/AndroidRuntime(26074):    ... 8 more
E/AndroidRuntime(26074):    Suppressed: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/legacy/content/WakefulBroadcastReceiver;
E/AndroidRuntime(26074):        at java.lang.VMClassLoader.findLoadedClass(Native Method)
E/AndroidRuntime(26074):        at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
E/AndroidRuntime(26074):        at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
E/AndroidRuntime(26074):        ... 12 more
E/AndroidRuntime(26074):    Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.legacy.content.WakefulBroadcastReceiver" on path: DexPathList[[zip file "/data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/base.apk"],nativeLibraryDirectories=[/data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/lib/arm64, /data/app/com.rinku.friendshive-Gbd9-6Fb8N-XDT23jqNErg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/product/lib64]]
E/AndroidRuntime(26074):        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:230)
E/AndroidRuntime(26074):        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
E/AndroidRuntime(26074):        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
E/AndroidRuntime(26074):        ... 15 more
E/MQSEventManagerDelegate(26074): failed to get MQSService.
I/Process (26074): Sending signal. PID: 26074 SIG: 9
Lost connection to device.
  

Теперь токен обмена сообщениями firebase создан и напечатан, но onmessage, Notified и Not Notified не печатаются, и в конечном итоге приложение завершает работу. сбой.

Я не знаю, что делать. Пожалуйста, кто-нибудь может мне помочь?