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