#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 не печатаются, и в конечном итоге приложение завершает работу. сбой.
Я не знаю, что делать. Пожалуйста, кто-нибудь может мне помочь?