flutter 实现绑定流getx [抖动]

anauzrmj  于 2022-12-14  发布在  Flutter
关注(0)|答案(1)|浏览(201)

我尝试将bindstream与GetX一起使用,但运行代码时出现错误:
类型“List”不是类型转换中类型“QuerySnapshot〈Object?〉”的子类型
这是我的控制器

final messages = <MessageModel>[].obs;

  Stream <List<MessageModel>> list(ChatRoomModel chatRoomId) {

    Stream<QuerySnapshot<Map<String, dynamic>>>? stream =
    _fireStore
        .collection('chatRooms')
        .doc(chatRoomId.chatRoomId)
        .collection('messages')
        .orderBy('createdon', descending: true)
        .snapshots();

    return stream.map((qShot) => qShot.docs
        .map((doc) => MessageModel.fromMap(doc.data()))
        .toList());
  }

@override
  void onInit() {
    messages.bindStream(list(ChatRoomModel()));
    super.onInit();
  }

主类

StreamBuilder(
                  stream: controller.list(chatRoom), //<-----
                  builder: (context, snapshot) {
                    if (snapshot.connectionState == ConnectionState.active) {
                      if (snapshot.hasData) {
                        QuerySnapshot dataSnapshot =
                            snapshot.data as QuerySnapshot;
                        return ListView.builder(
                            reverse: true,
                            itemCount: dataSnapshot.docs.length,
                            itemBuilder: (context, index) {
                                  ....
  • 谢谢-谢谢
nkoocmlb

nkoocmlb1#

您使用Getx的方式不对,Rx<T>接口不能用于替代Flutter/Dart中的Stream
Rx<T>可观察性用于Obx()小部件,以处理视图实现。
BindStream侦听Stream并根据It.//右语句为Rx<T>赋值
Rx<T>可观察值可以替换实际的Stream //错误句子。
你有两个选择来处理你的情况:

第一个选项:

直接使用StreamBuilder和真实的Stream,如下所示:

StreamBuilder(
       stream:  FirebaseFirestore.instance.collection('chatRooms').snapshots(), // Stream used in StreamBuilder
       builder: (context, snapshot) {
       // ...

第二个选项:

Obx(() {
 return controller.messages.isEmpty ? Text("loading") : YourWidgetBasedOnList() // used an Rx<T> in Obx
}),

总结一下:

  • Stream类型用于StreamBuilder
  • Rx<T>类型在Obx内部使用

相关问题