繁体   English   中英

Flutter StreamBuilder 没有监听新数据?

[英]Flutter StreamBuilder not listening to new data?

我有两个屏幕,一个是用户可以与特定人聊天的屏幕,另一个是他可以看到所有聊天列表的屏幕。

目的是在第二个屏幕上显示最后一条消息。 这是按如下方式完成的:

  1. 用户发送/接收新消息?
  2. 更新数据库
  3. BloC 通过获取最新数据发送新的 stream 数据。

问题是,stream 构建器没有收听新数据(不知道为什么)。 据我所知,当用户发送消息时,BloC 正在发送新的 stream 数据,只是不会在列表中重新呈现。

这是代码的缩短版本:

class ChatScreen extends StatelessWidget {
final ContactsBloc _contactsBloc = ContactsBloc();

@override()
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
            leading: IconButton(
              icon: Icon(Icons.arrow_back),
              onPressed: () {
                Navigator.pop(context, true);
              },
            ),
            body: Row(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
              Expanded(
                   child: TextField(
                      controller: messageTextController,
                      onChanged: (value) {
                          message = value;
                      },
                      decoration: kMessageTextFieldDecoration,
                   ),
              ),
              FlatButton(
                   onPressed: () async {
                      //update remote and local databases
                      await _contactsBloc.updateContact(
        {'last_message': utf8.decode(base64.decode(message))},
        'conversation_id = ?',
        [conversationId]);
                        },
                        child: Text(
                          'Send',
                          style: kSendButtonTextStyle,
                        ),
                      ),
                    ],
                  ),

聊天画面:

class ChatsScreen extends StatefulWidget {
  static const id = 'chats';

  @override
  _ChatsScreenState createState() => _ChatsScreenState();
}

class _ChatsScreenState extends State<ChatsScreen> {
  final ContactsBloc _contactsBloc = ContactsBloc();
  Iterable<Contact> contacts;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Chats'),
      body: Container(
          child: StreamBuilder(
        stream: _contactsBloc.contacts,
        builder: (context, results) {
          print('New stream: $results');
          if (!results.hasData) {
            return Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Center(
                  child: CircularProgressIndicator(),
                ),
              ],
            );
          } else {
            List contacts = results.data;
            contacts = contacts
                .where((element) => element.lastMessage != null)
                .toList();
            if (contacts.length > 0) {
              return ListView.builder(
                itemCount: contacts.length,
                itemBuilder: (context, index) {
                  ContactModel contact = contacts[index];
                  return ChatItem(
                    name: contact.name,
                    message: contact.lastMessage,
                    profilePicture: contact.profilePictureUrl,
                    lastSeen: contact.lastSeen,
                    user: currentUser,
                    toUser: contact.uid,
                    conversationId: contact.conversationId,
                  );
                },
              );
            }
            return Container();
          }
        },
      )),
    );
  }
}

联系集团:

class ContactsBloc {
  ContactsBloc() {
    getAllContacts();
  }

  final _contactsController = StreamController<List<ContactModel>>.broadcast();
  Stream<List<ContactModel>> get contacts => _contactsController.stream;

  _dispose() {
    _contactsController.close();
  }

  getAllContacts() async {
    List<ContactModel> contacts = await DatabaseProvider.db.getAllContacts();
    _contactsController.sink.add(contacts);
  }


  updateContact(var update, String where, List whereArgs) async {
    await DatabaseProvider.db.updateContact(update, where, whereArgs);
    getAllContacts();
  }

}

现在尝试添加它以创建 ContactBloc 的ContactBloc实例

class ContactsBloc{
  ContactsBloc._();
  static final ContactsBloc _instance = ContactsBloc._();
  factory ContactsBloc() => _instance;

 /// the rest of your code...
 
}

如果您想要更多地控制您的课程(Bloc、Provider、Redux 等),我建议您检查一些 state 管理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM