Bloc 8.x版本mapEventToState废弃,请求重写聊天应用MessageBloc
Bloc 8.x 版本适配:MessageBloc 重写方案
Bloc 8.0 及以上版本移除了mapEventToState方法,改用**事件处理器(Event Handlers)**的方式绑定事件与状态逻辑,以下是适配新版的完整重写方案:
无需修改的部分
你的MessageEvent和MessageState定义无需调整,直接沿用即可:
MessageEvent 代码
import 'package:chat/chat.dart'; import 'package:equatable/equatable.dart'; abstract class MessageEvent extends Equatable { const MessageEvent(); factory MessageEvent.onSubscribed(User user) => Subscribed(user); factory MessageEvent.onMessageSent(List<Message> messages) => MessageSent(messages); @override List<Object?> get props => []; } class Subscribed extends MessageEvent { final User user; Subscribed(this.user); @override List<Object?> get props => [user]; } class MessageSent extends MessageEvent { final List<Message> messages; MessageSent(this.messages); @override List<Object> get props => [messages]; } class MessageReceived extends MessageEvent { MessageReceived(this.message); final Message message; @override List<Object> get props => [message]; }
MessageState 代码
import 'package:chat/chat.dart'; import 'package:equatable/equatable.dart'; abstract class MessageState extends Equatable { const MessageState(); factory MessageState.initial() => MessageInitial(); factory MessageState.sent(Message message) => MessageSentSuccesfully(message); factory MessageState.received(Message message) => MessageReceivedSuccesfully(message); @override List<Object> get props => []; } class MessageInitial extends MessageState {} class MessageSentSuccesfully extends MessageState { final Message message; const MessageSentSuccesfully(this.message); @override List<Object> get props => [message]; } class MessageReceivedSuccesfully extends MessageState { final Message message; const MessageReceivedSuccesfully(this.message); @override List<Object> get props => [message]; }
重写后的 MessageBloc
新版使用on<Event>方法注册事件处理器,替代原有的mapEventToState:
import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:chat/chat.dart'; import 'package:flutter_newapp/src/blocs/message/message_event.dart'; import 'package:flutter_newapp/src/blocs/message/message_state.dart'; class MessageBloc extends Bloc<MessageEvent, MessageState> { final IMessageService _messageService; StreamSubscription? _subscription; MessageBloc(this._messageService) : super(MessageState.initial()) { // 注册 Subscribed 事件处理器 on<Subscribed>(_onSubscribed); // 注册 MessageReceived 事件处理器 on<MessageReceived>(_onMessageReceived); // 注册 MessageSent 事件处理器 on<MessageSent>(_onMessageSent); } // 处理 Subscribed 事件 void _onSubscribed(Subscribed event, Emitter<MessageState> emit) async { await _subscription?.cancel(); _subscription = _messageService .messages(activeUser: event.user) .listen((message) => add(MessageReceived(message))); } // 处理 MessageReceived 事件 void _onMessageReceived(MessageReceived event, Emitter<MessageState> emit) { emit(MessageState.received(event.message)); } // 处理 MessageSent 事件 void _onMessageSent(MessageSent event, Emitter<MessageState> emit) async { final message = await _messageService.send(event.messages); emit(MessageState.sent(message)); } @override Future<void> close() { _subscription?.cancel(); _messageService.dispose(); return super.close(); } }
关键变化说明
- 事件处理器注册:在构造函数中通过
on<Event>(handler)绑定每个事件对应的处理函数,替代原有的mapEventToState分支判断 - Emitter 替代 yield:使用
Emitter<MessageState>对象的emit方法发送新状态,替代原有的yield关键字 - 异步处理简化:异步逻辑直接在处理器函数中使用
async,无需async*生成器
内容的提问来源于stack exchange,提问作者FERHATI KHALIL
相关产品推荐
相关产品推荐

