Trigger Pu sh Уведомления в приложении Flutter с Python - PullRequest
0 голосов
/ 08 марта 2020

Следующий сценарий ...

Я хотел бы разработать приложение 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.

Я с нетерпением жду любых ответов.

Спасибо!

1 Ответ

0 голосов
/ 15 марта 2020

Я решил проблему самостоятельно.

snapshot.data (); Функция недоступна, когда вы работаете в среде базы данных в реальном времени.

Вам необходимо изменить функцию триггера на functions.database.ref (), а затем обратиться к снимку к snapshot.val (), чтобы вы могли может получать изменения из базы данных в реальном времени и pu sh данных на устройство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...