Благодаря большому толчку в правильном направлении от Дуга я смог понять это! Разместите мой код ниже, чтобы помочь кому-либо сделать тот же шаг в правильном направлении.
Итак, на странице настроек моего приложения-флаттера пользователь может включать и отключать уведомления для нескольких категорий. Предпочтения пользователя затем сохраняются в указанном пользователем документе c в моей коллекции Cloud Firestore users
. Ниже приведен код для примера SwitchListTile
, который я использовал на странице настроек.
SwitchListTile(
title: Text('Admin notifications'),
subtitle: Text('Maintenance and general notes'),
onChanged: (value) {
setState(() {
adminNotifications = value;
Firestore.instance
.collection('users')
.document(loggedInUser.uid)
.updateData({
'adminNotifications': value,
});
});
save('adminNotifications', value);
},
value: adminNotifications,
),
В своей облачной функции я добавил ссылку на документ в коллекцию users
и чек, чтобы увидеть если значение поля adminNotifications
равно true
. Если это так, уведомление отправляется, в противном случае уведомление не отправляется пользователю. Ниже я добавил функцию облака. Обратите внимание, что облачная функция выводит «вложенных обещаний» предупреждений, но пока работает! Я все еще начинающий Флаттер, поэтому я был очень рад, что это сработало. Еще раз большое спасибо Дагу!
exports.userNotifications = functions.firestore.document('notifications/{any}').onCreate((change, context) => {
const userFcm = change.data().fcmToken;
const title = change.data().title;
const body = change.data().body;
const forUser = change.data().for;
const notificationContent = {
notification: {
title: title,
body: body,
badge: '1',
click_action: 'FLUTTER_NOTIFICATION_CLICK',
}
};
var usersRef = db.collection('users');
var queryRef = usersRef.where('login', '==', forUser).limit(1).get()
.then(snapshot => {
snapshot.forEach(doc => {
const adminNotifications = doc.data().adminNotifications;
console.log(adminNotifications);
if(swapNotifications === true){
return admin.messaging().sendToDevice(userFcm, notificationContent)
.then(() => {
console.log('notification sent')
return
})
.catch(error =>{
console.log('error in sending notification', error)
})
} else {
console.log('message not send due to swapNotification preferences')
}
return console.log('reading user data success');
})
.catch(err => {
console.log('error in retrieving user data:', err)
})
});