在新的数据库记录上更新移动应用程序中的小部件



我正在使用flutter开发一个应用程序。后端在flask中,数据库是nosql(mongodb(。

我有一个小部件,显示喜欢文章的用户。我想要实现的是:

A( 如果用户X喜欢我当前正在观看的一篇文章,我想立即看到它(即他的头像,名字,无关紧要(。

B( 假设我在另一个屏幕上(即设置(,我希望同样的情况在后台发生,所以当我回到文章屏幕时,看看喜欢文章的用户(如果可能的话(。

到目前为止,我所知道的是,我必须使用流生成器(flutter(。这很好,我理解这是怎么回事。

我的问题是如何将新的服务器事件/数据库记录(用户X喜欢文章Y(推送到应用程序。

我应该使用服务器发送的事件、WebSocket还是有其他解决方案?如果sse和ws是唯一的解决方案,那么考虑到我使用flask作为后端,哪一个更可取?

不幸的是,我在网上看到的几乎所有例子都在使用firebase(并不是所有人都想使用firebase!(,而且没有一个websocket例子提到我们想从数据库中检索的数据。

任何参考有用的教程(没有firebase!(都会非常有用。

我正在为一个聊天应用程序做类似的事情,我必须使用flask-socketio从flask发出事件,使用socket_io_client: ^2.0.0-beta.4-nullsafety.0flutter_bloc来处理我的状态。我使用的是测试版flutter socket_io_client,因为我的服务器使用的是当前稳定版本不支持的socketio 4。

颤振

@injectable
class SocketBloc extends Bloc<SocketEvent, SocketState> {
final Socket _socket;
SocketBloc(this._socket)
: super(SocketState.initial()) {
on<SocketEvent>((event, emit) async {
await event.map(
connecting: (value) async => await _mapConnectingToState(emit, value),
connected: (value) async => await _mapConnectToState(emit, value),
disconnected: (value) async => await _mapDisconnectToState(emit, value),
error: (value) async => await _mapErrorToState(emit, value),
connect: (value) async => await _mapSocketConnectToState(emit, value),
inquiries: (value) async => await _mapAddInquiriesToState(emit, value),
setActiveInquiry: (value) async =>
await _mapSetActiveInquiryToState(emit, value),
newChatMessage: (value) async =>
await _mapNewChatMessageToState(emit, value),
newMessage: (value) async => await _mapNewMessageToState(emit, value),
sendChat: (value) async => await _mapSendChatToState(emit, value),
uploadFiles: (value) async => await _mapUploadFilesToState(emit, value),
);
});
_setUpListeners();
}
void _setUpListeners() {
_socket.onConnecting((data) => add(const SocketEvent.connecting()));
_socket.onConnect((data) => add(const SocketEvent.connected()));
_socket.onConnectError((data) => add(const SocketEvent.error()));
_socket.onDisconnect((data) => add(const SocketEvent.disconnected()));
_socket.on(
Events.INQUIRIES.name,
(data) => add(SocketEvent.inquiries(data)),
);
_socket.on(
Events.NEW_CHAT.name,
(data) => add(SocketEvent.newChatMessage(data)),
);
_socket.on(
Events.NEW_MESSAGE.name,
(data) => add(SocketEvent.newMessage(data)),
);
}

烧瓶

@socketio.on(prefix)
def handle_new_message(data):
admin = get_admin()
if not admin:
raise Exception("Admin not configured")
# Get user by sid
db_user = User.objects.get(session=request.sid)
if not db_user:
raise Exception("No such client")
message = data.get('message')
if not message:
raise Exception("No message content")
message_id = data.get('message_id')
if not message_id:
raise Exception("No message ID")
db_message = Message.objects.get(pk=message_id)
if not db_message:
raise Exception("No such message")
# TODO - Affirm that sender is owner of message
chat = Chat(message=message,
message_id=message_id,
recipient=admin.uid,
sender=db_user.uid)
chat.save()
emit(SocketEvents.NEW_CHAT.name, JSONEncoder().encode(clear_cls(chat.to_mongo().to_dict())))
db_message.last_message = chat.message
db_message.save()
emit(SocketEvents.NEW_MESSAGE.name, JSONEncoder().encode(clear_cls(db_message.to_mongo().to_dict())))

最新更新