Состояние флаттера не обновляется после выхода нового состояния - PullRequest
1 голос
/ 22 апреля 2020

Я использую blo c в приложении флаттера, и моя проблема в том, что представление не обновляется, когда выдает новое состояние. Я хочу добавить новое сообщение в мой список сообщений. и я даю то же состояние с новыми данными, но мое представление не обновляется после добавления нового сообщения в список. Blo c:

class ChatBloc extends Bloc<ChatEvent, ChatState> {
  @override
  ChatState get initialState => ChatInitial();

  @override
  Stream<ChatState> mapEventToState(ChatEvent event) async* {
   if (event is AddToMessages) {
      yield* _mapAddToMessagesEventToState(event.chatMessage);
    }
  }

  Stream<ChatState> _mapAddToMessagesEventToState(ChatMessage chatMessage) async* {
    List<ChatMessage> chatMessages = (state as DataLoaded).chatMessages;
    chatMessages.insert(0, chatMessage);
    yield DataLoaded(chatMessages: chatMessages);
  }
}

событие:

abstract class ChatEvent extends Equatable {}
class AddToMessages extends ChatEvent {
  final ChatMessage chatMessage;
  AddToMessages({@required this.chatMessage});
  @override
  List<Object> get props => [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];
}

и просмотр:

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),
            );
          },
        ),
      ),
    );
  }
}

Когда я добавить новое сообщение, вид не обновляется. Где моя ошибка.

1 Ответ

0 голосов
/ 22 апреля 2020

Edit: получается после всего этого, потому что вы используете equatable, и потому что, когда вы отправляете новое состояние, вы только изменяете список старого состояния, вставляя в него сообщение, затем испуская старое состояние с тем же списком, поэтому, когда blo c сравнивает два состояния и поскольку класс состояний расширяется как равный, blo c считает их одинаковыми и не выдает решение

состояния : удалите равные

или

используйте неизменяемые списки, чтобы вы могли создать новое состояние, которое имеет свойство, отличное от предыдущего, и может быть выделено по blo c

...