Flutter 颤振状态在屈服新状态后不更新

Flutter 颤振状态在屈服新状态后不更新,flutter,bloc,Flutter,Bloc,我在Flatter应用程序中使用bloc,我的问题是在产生新状态时视图没有更新。 我想在邮件列表中添加新邮件。我对新数据产生相同的状态,但在向列表中添加新消息后,我的视图不会更新。 集团: class ChatBloc扩展了Bloc{ @凌驾 ChatState get initialState=>ChatInitial(); @凌驾 流mapEventToState(ChatEvent事件)异步*{ 如果(事件为AddToMessages){ yield*_mapaddtoMessageEve

我在Flatter应用程序中使用bloc,我的问题是在产生新状态时视图没有更新。 我想在邮件列表中添加新邮件。我对新数据产生相同的状态,但在向列表中添加新消息后,我的视图不会更新。 集团:

class ChatBloc扩展了Bloc{
@凌驾
ChatState get initialState=>ChatInitial();
@凌驾
流mapEventToState(ChatEvent事件)异步*{
如果(事件为AddToMessages){
yield*_mapaddtoMessageEventToState(event.chatMessage);
}
}
Stream _MapAddToMessageEventToState(ChatMessage ChatMessage)异步*{
列出chatMessages=(状态为DataLoaded);
chatMessage.insert(0,chatMessage);
产生加载的数据(chatMessages:chatMessages);
}
}
活动:

abstract class ChatEvent extends Equatable {}
class AddToMessages extends ChatEvent {
  final ChatMessage chatMessage;
  AddToMessages({@required this.chatMessage});
  @override
  List<Object> get props => [chatMessage];
}
抽象类ChatEvent扩展了equalable{}
类AddToMessages扩展了ChatEvent{
最终聊天信息聊天信息;
AddToMessages({@required this.chatMessage});
@凌驾
列表获取道具=>[chatMessage];
}
声明:

abstract class ChatState extends Equatable {
  const ChatState();
}

class ChatInitial extends ChatState {
  const ChatInitial();

  @override
  List<Object> get props => [];
}
class DataLoaded extends ChatState {
  final List<ChatMessage> chatMessages;
  const DataLoaded({this.chatMessages});

  @override
  List<Object> get props => [chatMessages];
}
抽象类ChatState扩展了equalable{
const ChatState();
}
类ChatInitial扩展了ChatState{
常量ChatInitial();
@凌驾
列表获取道具=>[];
}
类DataLoaded扩展了ChatState{
最后的聊天信息列表;
常量数据加载({this.chatMessages});
@凌驾
列表获取道具=>[chatMessages];
}
和视图:

class ChatScreen extends StatelessWidget {
  Widget createBody(ChatState state, BuildContext context) {
    if (state is DataLoaded) {
      return Column(
        children: <Widget>[
          MessagesList(
            messages: state.chatMessages,
          ),
          SendBar(
            onMessage: (message) => BlocProvider.of<ChatBloc>(context).add(
              AddToMessages(
                chatMessage: ChatMessage(
                  chatMessageType: ChatMessageType.TEXT,
                  dateTime: DateTime.now(),
                  message: message,
                  userId: store.state.userProfile.id,
                ),
              ),
            ),
          ),
        ],
      );
    } else {
      return Container();
    }
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider<ChatBloc>(
      create: (context) {
        return ChatBloc(chatRepository: chatRepository)..add(DataLoaded(chatMessages: []));
      },
      child: BlocListener<ChatBloc, ChatState>(
        listener: (context, state) async {},
        child: BlocBuilder<ChatBloc, ChatState>(
          builder: (context, state) {
            return Scaffold(
              body: createBody(state, context),
            );
          },
        ),
      ),
    );
  }
}
class ChatScreen扩展了无状态小部件{
小部件createBody(ChatState、BuildContext上下文){
如果(状态为数据加载){
返回列(
儿童:[
消息列表(
消息:state.chatMessages,
),
森巴(
onMessage:(message)=>BlocProvider.of(context.add)(
附加信息(
聊天信息:聊天信息(
chatMessageType:chatMessageType.TEXT,
dateTime:dateTime.now(),
讯息:讯息,,
userId:store.state.userProfile.id,
),
),
),
),
],
);
}否则{
返回容器();
}
}
@凌驾
小部件构建(构建上下文){
返回BlocProvider(
创建:(上下文){
返回ChatBloc(chatRepository:chatRepository)…添加(数据加载(chatMessages:[]);
},
孩子:布洛克斯腾纳(
侦听器:(上下文,状态)异步{},
孩子:BlocBuilder(
生成器:(上下文、状态){
返回脚手架(
body:createBody(状态、上下文),
);
},
),
),
);
}
}
添加新邮件时,视图不会更新。
我的错误在哪里。

编辑:毕竟是因为您使用的是equalable,并且因为当您发出一个新状态时,您只需通过在其中插入一条消息来更改旧状态的列表,然后用相同的列表发出旧状态,所以当bloc比较这两个状态时,由于state类扩展了equalable,所以该集团认为它们是相同的,并且不发出状态

解决方案:删除equalable


使用不可变列表,这样您可以发出一个新状态,该状态的属性与前一个状态不同,并且可以通过bloc区分

因此,我必须在我的state类中删除
const
?如果您从其他地方调用它(我怀疑这一点),您可以保留它,但无论如何都可以从mapEventToState()调用它特别是在使用equatable时,您不应该调用它,因此添加一个非常量构造函数必须解决您的问题,请参阅答案中的链接我不想产生其他状态。您是否尝试删除常量构造函数,但它不起作用?很抱歉,我不能为您尝试,因为我没有您的代码我定义如下
DataLoaded({this.chatMessages})
class ChatScreen extends StatelessWidget {
  Widget createBody(ChatState state, BuildContext context) {
    if (state is DataLoaded) {
      return Column(
        children: <Widget>[
          MessagesList(
            messages: state.chatMessages,
          ),
          SendBar(
            onMessage: (message) => BlocProvider.of<ChatBloc>(context).add(
              AddToMessages(
                chatMessage: ChatMessage(
                  chatMessageType: ChatMessageType.TEXT,
                  dateTime: DateTime.now(),
                  message: message,
                  userId: store.state.userProfile.id,
                ),
              ),
            ),
          ),
        ],
      );
    } else {
      return Container();
    }
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider<ChatBloc>(
      create: (context) {
        return ChatBloc(chatRepository: chatRepository)..add(DataLoaded(chatMessages: []));
      },
      child: BlocListener<ChatBloc, ChatState>(
        listener: (context, state) async {},
        child: BlocBuilder<ChatBloc, ChatState>(
          builder: (context, state) {
            return Scaffold(
              body: createBody(state, context),
            );
          },
        ),
      ),
    );
  }
}