You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:50:24