【问题标题】:Getting a Stream<List<Object>> from a Stream<Event> from firebase real time database Flutter从 Firebase 实时数据库 Flutter 中的 Stream<Event> 获取 Stream<List<Object>>
【发布时间】:2020-06-07 22:07:06
【问题描述】:

我对 Flutter Streams/Bloc/Provider 很陌生,我正在按照教程来理解它。 在教程面团中,他们使用 Firestore,所以他们得到了这样的流:

Stream<List<Todo>> todos() {
    return todoCollection.snapshots().map((snapshot) {
      return snapshot.documents 
          .map((doc) => Todo.fromEntity(TodoEntity.fromSnapshot(doc)))
          .toList();
    });
  }

他们的快照是List&lt;DocumentSnapshot&gt;,而我来自RTDB 的快照是Event. 我试图从RTDB 节点获取Stream&lt;List&lt;Object&gt;&gt;,但从.onValue() 属性我得到Stream&lt;Event&gt;。 在async map() 内部,我访问了snapshot 事件,但我无法访问Dart.coremap(),就像在使用Firestore 的示例中一样,因为它不是列表。 alerts()bloc 将要收听的流,但它期待 Stream&lt;List&lt;Object&gt;&gt; 并且我无法得到它。 我将如何根据需要将其映射到Stream&lt;List&lt;Object&gt;&gt;? 非常感谢您的时间和帮助。 我的代码是:

// 
static UserAlert fromSnapshot(DataSnapshot snapshot) {
    return UserAlert(
        city: snapshot.value['City'],
        country: snapshot.value['Country'],
        date: snapshot.value['Date'],
        description: snapshot.value['Description'],
        id: snapshot.value['Id'],
        latitude: snapshot.value['Latitude'],
        longitude: snapshot.value['Longitude'],
        region: snapshot.value['Region'],
        timestamp: snapshot.value['Timestamp'],
        alertImageName: snapshot.value['alertImageName'],
        imageUrl: snapshot.value['imageUrl'],
        user: snapshot.value['user']);
  }


// try 1
Stream<List<UserAlert>> alerts() {
    return _databaseReference.onValue.map((snapshot) {
      // do the mapping to a Stream<List<UserAlert>>
    });
  }

 // try 2
 Stream<List<UserAlert>> alerts() {
return _databaseReference.onValue.toList(){ // Function expressions can't be named error

};

}

 // try 3
 Stream<List<UserAlert>> alerts() {
return _databaseReference.onValue.map(
    (snapshot) => UserAlert.fromSnapshot(snapshot); // wrong return type
);

}

【问题讨论】:

    标签: flutter firebase-realtime-database


    【解决方案1】:

    使用 StreamTransformer

    Stream<UserAlert> alerts() {
      handleData(Event event, EventSink<UserAlert> sink) =>
          sink.add(UserAlert.fromSnapshot(event.snapshot.value));
    
      final transformer =
          StreamTransformer<Event, UserAlert>.fromHandlers(handleData: handleData);
    
      return _databaseReference.onValue.transform(transformer);
    }
    

    【讨论】:

    • 非常感谢。它抛出一个错误面团“参数类型'Stream'不能分配给参数类型'Iterable>”。你能看到发生了什么吗?
    • 如何获取用户警报列表? _databaseReference.onValue 是什么?
    • Stream> alerts() { handleData(Event event, EventSink> sink) => sink.add([UserAlert.fromSnapshot(event.snapshot)]) ;最终转换器 = StreamTransformer>.fromHandlers(handleData: handleData);返回_databaseReference.onValue.transform(变压器); }
    • alerts().listen((alert) { final aList = [alert]; });
    • 祝你好运~~干杯
    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 2021-03-06
    • 2021-04-24
    • 2020-06-07
    • 2021-03-04
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多