【问题标题】:How to configure Flutter Firebase Database onEntryChanged listener correctly?如何正确配置 Flutter Firebase Database onEntryChanged 监听器?
【发布时间】:2020-01-16 23:14:16
【问题描述】:

我正在构建一个有状态的 Flutter 页面,允许用户互相关注。一旦他们都关注另一个人,我希望页面的状态发生变化并允许用户互相发送消息。我创建了一个侦听器,该侦听器在正确加载页面后查询数据库一次。现在,如果用户 2 进行更改,我正在尝试更新用户 1 的页面,立即使用 onEntryChange 并且它不起作用。我已经进入并手动删除了数据库中的条目,并且 UI 状态保持不变。这是我的代码...

String messageBtn;

     FriendsVideoPageState(){
        fb.child('friends/$id/friends/$uid').onChildChanged.listen(_onEntryChanged);
      }

      _onEntryChanged(Event event) {
        print('Listener..............${event.snapshot.value.toString()}');
        if (event.snapshot.value != null){
          setState(() {
            messageBtn = 'Message';
          });
        } else {
          setState(() {
            messageBtn = 'Invite';
          });
        }
      }

【问题讨论】:

    标签: firebase firebase-realtime-database flutter state


    【解决方案1】:

    onChildChanged 是一个流,当我使用流时,我经常使用StreamBuilder,因为它使事情变得简单。

    所以你可以使用 StreamBuilder 和这样的东西:

    Widget build(BuildContext build) {
      return StreamBuilder(
        stream: fb.child('friends/$id/friends/$uid').onChildChanged,
        builder: (context, snapshot) {
          return Text(snapshot.data == null ? 'Loading' : snapshot.data.snapshot.value ? 'Message' : 'Invite');
        },
      );
    }
    

    每次流的新值到达时,都会调用构建器方法并因此编辑文本内容。

    【讨论】:

    • 我用 StreamBuilder 替换了我的“文本”小部件,但它没有按预期工作。 Snapshot.data 从来都不是空的,即使我在末尾添加了toString(),它也始终是一个“事件实例”。有什么想法吗?
    • 那么您处理数据的方式可能没有问题,而是 Firebase 数据库出于某种原因不发送任何数据的问题。我的第一个猜测是:您无权读取此数据。第二:尝试其他流,如 onValue、onChildAdded、...如果它们有任何价值
    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 2010-12-11
    • 2020-12-25
    • 2021-01-23
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多