【问题标题】:Stream not returning any value流不返回任何值
【发布时间】:2022-11-04 01:11:27
【问题描述】:

我有一个显然不返回值的流。我在 Streambuilder 中使用的快照没有返回任何内容,而是返回黄色容器(参见下面的代码),当我的快照没有数据时返回该容器。知道是什么导致了这个问题吗?

下面是所有函数,流以及我的 Streambuilder。

  import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:blabber_tech/services/auth.dart';
import 'package:blabber_tech/services/chat_services.dart';
import 'package:rxdart/rxdart.dart';
import 'package:blabber_tech/models/room_model.dart';

// Rooms List Model
class RoomsListModel {
  String roomId;
  String otherUserId;
  String avatar;
  String name;
  String lastMessage;
  Timestamp lastMessageTime;

  RoomsListModel(
      {required this.roomId,
      required this.otherUserId,
      required this.avatar,
      required this.name,
      required this.lastMessage,
      required this.lastMessageTime});
}

class MyChatsScreen3 extends StatefulWidget {
  static const String id = "mychats3_screen";

  @override
  State<MyChatsScreen3> createState() => _MyChatsScreenState();
}

// get other user details
Future getOtherUser(String id) async {
  // get other user profile
  var user = await FirebaseFirestore.instance
      .collection("users")
      .doc(id)
      .get()
      .then((value) => value.data()) as Map<String, dynamic>;
  // return other user profile
  return user;
}

class _MyChatsScreenState extends State<MyChatsScreen3> {
  // get current user id
  String userId = AuthService().getUserId();

  // get all active chats
  **Stream<List>? roomsListStream() {**
    try {
      FirebaseFirestore.instance
          .collection("rooms")
          .where("users", arrayContains: userId)
          .orderBy("latestMessageTime", descending: true)
          .snapshots()
          .map((QuerySnapshot query) {
        List<RoomsListModel> retVal = [];
        query.docs.forEach((element) {
          retVal.add(RoomsListModel(
              roomId: element.id,
              otherUserId: element["users"][0] == userId
                  ? element["users"][1]
                  : element["users"][0],
              avatar: element["photoUrl"],
              name: element["name"],
              lastMessage: element["latestMessage"],
              **lastMessageTime: element["latestMessageTime"]**));
        });

        return retVal;
      });
    } catch (e) {
      print("Error: $e");
    }
  }

// List builder for mobile app
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        // create listview of all chats of current user and show last message and other user name and photo
        child: **StreamBuilder(**
          stream: roomsListStream(),
          builder: (context, AsyncSnapshot<dynamic> snapshot) {
            **if (snapshot.hasData) {**
              return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    leading: CircleAvatar(
                        // show other user profile photo
                        //backgroundImage:
                        //NetworkImage(otherUser["profilePhotoUrl"]),
                        ),
                    //title: Text(snapshot.data[index]["userName"]),
                    subtitle: Text(snapshot.data[index]["lastMessage"]),
                  );
                },
              );
            } else {
              return Container(
                color: Colors.yellow,
              );
            }
          },
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: android flutter dart google-cloud-firestore


    【解决方案1】:

    您忘记 await 获取 FirebaseFirestore 结果:

    var rooms = await FirebaseFirestore.instance
              .collection("rooms")
              .where("users", arrayContains: userId)
              .orderBy("latestMessageTime", descending: true)
              .snapshots();
    
    rooms.map((QuerySnapshot query) ...
    

    【讨论】:

    • 当我这样做时,我需要将异步添加到我的函数中并使其成为未来。但是当我这样做时,我的 StreamBuilder 中出现此错误:“参数类型 'Future<Stream<List<dynamic>>?>' 不能分配给参数类型 'Stream<dynamic>?'。”
    • 我再次更新了我的答案,请检查一下。
    • 这些更改现在有效。但是我仍然只是返回黄色容器而不是 if(snapshot.hasData) 下面的任何内容
    • 我将我的答案回滚到上一个,您可以使用async* 而不是async
    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    相关资源
    最近更新 更多