为什么我的听众不返回任何数据?

发布于 2025-02-10 04:34:29 字数 1029 浏览 0 评论 0原文

我正在尝试将所有内容保持模块化,然后偶然发现了一个问题。我想在我的message_dao窗口小部件中保留所有代码与Firebase实时数据库和Firebase Cloud存储有关激活侦听器的功能。但是,看起来接收到正在接收一个空列表,因为当我打印出chats变量时,它是空的。

message_dao

Future<List> activateChatListener() async { 

    var msg;

    _receivedChatsStream = _messagesRef.onValue.listen((event) {

      event.snapshot.children.forEach((snapshot) {
        dataList.add(snapshot.value);

      });

      //...other code that returns a future...

    });

    return dataList;
  }

接收chat

class _ReceivedChatsState extends State<ReceivedChats> {
  var chats = [];

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

Future<void> loadChats() async {

    var dataList = await messageDao.activateChatListener();

    setState(() {
      chats = dataList;
    });

    print('chats: ' + chats.toString()) //This shows an empty list

  }

//...other code...
}

I'm trying to keep everything modular and I stumbled onto a problem. I want to keep all code related to Firebase Realtime Database and Firebase Cloud Storage in my message_dao widget, so I have my receivedChats widget calling a message_dao function that activates the listener. However, it looks like receivedChats is receiving an empty list because when I print out the chats variable it's empty.

message_dao

Future<List> activateChatListener() async { 

    var msg;

    _receivedChatsStream = _messagesRef.onValue.listen((event) {

      event.snapshot.children.forEach((snapshot) {
        dataList.add(snapshot.value);

      });

      //...other code that returns a future...

    });

    return dataList;
  }

receivedChats

class _ReceivedChatsState extends State<ReceivedChats> {
  var chats = [];

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

Future<void> loadChats() async {

    var dataList = await messageDao.activateChatListener();

    setState(() {
      chats = dataList;
    });

    print('chats: ' + chats.toString()) //This shows an empty list

  }

//...other code...
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谁对谁错谁最难过 2025-02-17 04:34:29

您正在返回listbe之前的API完成获取数据之前,

请尝试使用此列表

Future<List> activateChatListener() async { 

    var msg;

    _receivedChatsStream = _messagesRef.onValue.listen((event) {

      event.snapshot.children.forEach((snapshot) {
        dataList.add(snapshot.value);

      });

      //Some other code that returns a future
     return dataList;
    });

    
  }

You are returning the listbefore the api has finished fetching data

Try this instead

Future<List> activateChatListener() async { 

    var msg;

    _receivedChatsStream = _messagesRef.onValue.listen((event) {

      event.snapshot.children.forEach((snapshot) {
        dataList.add(snapshot.value);

      });

      //Some other code that returns a future
     return dataList;
    });

    
  }
权谋诡计 2025-02-17 04:34:29

因为您的loadchats将被调用一次。 将数据存储到datalist数组中,

您可以直接通过streamBuilder示例

class NoteList extends StatelessWidget {
  final db = FirebaseFirestore.instance;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Notes"),
        centerTitle: true,
      ),
      body: StreamBuilder<QuerySnapshot>(
        stream: db.collection('notes').snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          } else
            return ListView(
              children: snapshot.data.docs.map((doc) {
                return Card(
                  child: ListTile(
                    title: Text(doc.data()['title']),
                  ),
                );
              }).toList(),
            );
        },
      ),
    );
  }
}

而是完整的示例您可以参考并且可以解决问题。

Because your loadChats will be called once. Instead of storing your data into dataList array, you can directly use that snapshot through StreamBuilder

Example:

class NoteList extends StatelessWidget {
  final db = FirebaseFirestore.instance;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Notes"),
        centerTitle: true,
      ),
      body: StreamBuilder<QuerySnapshot>(
        stream: db.collection('notes').snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(),
            );
          } else
            return ListView(
              children: snapshot.data.docs.map((doc) {
                return Card(
                  child: ListTile(
                    title: Text(doc.data()['title']),
                  ),
                );
              }).toList(),
            );
        },
      ),
    );
  }
}

Here is the full example that you can refer and you can solve your problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文