Следующий сценарий ...
Я хотел бы разработать приложение Flutter, которое позволяет получать уведомление pu sh после нажатия кнопки (аналогично дверному звонку). Эта кнопка подключена к inte rnet.
Что у меня до сих пор ...
main.dart
import 'package:flutter/material.dart';
import "FireBaseMessaging.dart";
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: FirebaseMessagingDemo(),
);
}
}
FirebaseMessagingDemo.dart
import "package:flutter/material.dart";
import "package:firebase_messaging/firebase_messaging.dart";
class FirebaseMessagingDemo extends StatefulWidget {
FirebaseMessagingDemo() : super();
final String title = 'Firebase Messaging Demo';
@override
State<StatefulWidget> createState() => _FirebaseMessagingDemoState();
}
class _FirebaseMessagingDemoState extends State<FirebaseMessagingDemo> {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
_getToken() {
_firebaseMessaging.getToken().then((deviceToken) {
print("Device Token: $deviceToken");
});
}
List<Message> messagesList;
_configureFirebaseListeners() {
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print('onMessage: $message');
_setMessage(message);
},
onLaunch: (Map<String, dynamic> message) async {
print('onLaunch: $message');
_setMessage(message);
},
onResume: (Map<String, dynamic> message) async {
print('onResume: $message');
_setMessage(message);
},
);
}
_setMessage(Map<String, dynamic> message) {
final notification = message['notification'];
final data = message['data'];
final String title = notification['title'];
final String body = notification['body'];
String mMessage = data['message'];
print("Title: $title, body: $body, message: $mMessage");
setState(() {
Message msg = Message(title, body, mMessage);
messagesList.add(msg);
});
}
@override
void initState() {
super.initState();
messagesList = List<Message>();
_getToken();
_configureFirebaseListeners();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ListView.builder(
itemCount: messagesList == null ?
0
: messagesList.length,
itemBuilder: (context, index) {
return Card(
child: Text(messagesList[index].message),
);
},
)
);
}
}
class Message {
String title;
String body;
String message;
Message(title, body, message) {
this.title = title;
this.body = body;
this.message = message;
}
}
Для этой цели в Firebase имеется облачная функция, которая запрашивает операции записи в облачном хранилище и отправляет уведомление pu sh на устройство при создании новой записи.
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().functions);
var newData;
exports.myTrigger = functions.firestore.document('Messages/{messageID}').onCreate(async (snapshot, context) => {
//
if (snapshot.empty) {
console.log('No Devices');
return;
}
var tokens = ['$$DeviceToken$$'];
newData = snapshot.data();
var payload = {
notification: {
title: 'Push Title',
body: 'Push Body',
sound: 'default',
},
data: {
click_action: 'FLUTTER_NOTIFICATION_CLICK',
message: newData.message,
},
};
try {
const response = await admin.messaging().sendToDevice(tokens, payload);
console.log('Notification sent successfully');
} catch (err) {
console.log(err);
}
});
Пока это работает.
Мой план состоит в том, чтобы я использовал Rasberry Pi для настройки кнопки, которая запускает скрипт Python, который генерирует запись в Cloud Firestore Collection и таким образом приносит пу sh уведомление на телефон через облачную функцию.
Единственная возможность, которую я видел, была запись в базу данных в реальном времени, но это не вызывает функцию облака. Так что у меня нет возможности, если облачная функция не может проверять изменения в базе данных в реальном времени.
Я открыт для решений любого рода. Может быть, это возможно сделать полностью без облачной функции или без Firebase. Или есть возможность написать в Cloud Firestore через Python.
Я с нетерпением жду любых ответов.
Спасибо!