Что я сделал не так с классом 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();
}
},
}
);
}