Что я сделал не так с классом MessagesBloc и как его создать?

Lorem Ipsum - это просто фиктивный текст полиграфической и наборной индустрии. Lorem Ipsum был стандартным фиктивным текстом в отрасли с 1500-х годов, когда неизвестный типограф взял камбуз и скремблировал его, чтобы сделать книгу образцов шрифта. Он пережил не только пять веков, но и скачок в электронный набор, оставшись практически неизменным. Он был популяризирован в 1960-х годах с выпуском листов Letraset, содержащих отрывки Lorem Ipsum, а в последнее время - с помощью программного обеспечения для настольных издательских систем, такого как Aldus PageMaker, включая версии Lorem Ipsum.

2 ответа

Если в родительском виджете нет BlocProvider, вам необходимо создать экземпляр блока и передать его BlocBuilder.

MessageBloc _messageBloc = MessageBloc(databaseService: someDatabaseServicInstance);
...

    Widget build(BuildContext context) {
           return BlocBuilder<MessagesBloc, MessagesState>(
        bloc: _messageBloc,
        builder: (context, state) {
      if (state is Loading) {
        return LoadingIndicator();
      }
      if (state is Finished) {
        messages = state.messages;
        return messages.length != 0
            ? _buildMessageView(messages)
            : _buildEmptyMessageView();
      }
    });
};

Приходит сообщение fcm -> AddMessage -> BlocListener прослушивает событие AddMessageComplete -> заменяет переменную сообщений из state.messages (вы должны добавить состояние события AddMessage, например AddMessageFinished или AddMessageComplete)

List<Message> messages = [];
MessageBloc _messageBloc = BlocProvider.of<MessagesBloc>(context);

  @override
  void initState() {
    super.initState();
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");

        var result = Message.fromMap(
            new Map<String, dynamic>.from(message['notification']));

         // I exactly don't know it works, if not works use yours.
        _messageBloc.add(
          AddMessage(message: result),
        );

        //setState(() {
        //  messages.add(result);
        //});
      },
  }

    Widget build(BuildContext context) {
      return BlocConsumer<MessagesBloc, MessagesState>(
        listener: (context, state) {
           if (state is AddCompleted) {
              setState(() {
                messages = state.messages;
              }
           }
        },
        builder: (context, state) {
          if (state is Loading) {
            return LoadingIndicator();
          }
          if (state is Finished) {
            messages = state.messages;
            return messages.length != 0
                ? _buildMessageView(messages)
                : _buildEmptyMessageView();
          }
        },
      }
    );
  }
Другие вопросы по тегам