Объедините потоки БД Firebase с RxDart - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь объединить два потока с помощью RxDart и отобразить поток в ListView.

Я смоделировал эту технику на основе этого поста Как объединить данные из двух коллекций Firestore во Flutter? , однако, когда я запускаю этот код, я возвращаю пустой набор данных.

Любая помощь будет принята с благодарностью!

import 'package:rxdart/rxdart.dart';

class _HomeScreenState extends State<HomeScreen> {

  Stream<List<CombineStream>> _combineStream;
  String currentUserId = 'id12345'

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

      _combineStream =
          usersChatsRef.child(currentUserId).onValue.map((userChatStream) {
        return (userChatStream.snapshot.value).map((f) {
          Stream<UsersChats> uDetail =
              f.map<UsersChats>((node) => UsersChats.fromMap(node));

          Stream<Chat> sDetail = chatsDetailsRef
              .child(f.key)
              .onValue
              .map<Chat>((node2) => Chat.fromMap(node2.snapshot.value));

          return Rx.combineLatest2(
              uDetail, sDetail, (u, s) => CombineStream(u, s));
        });
      }).switchMap((streams) {
        return (streams.length) > 0
            ? streams.combineLatestList(streams)
            : streams.just([]);
      });

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: StreamBuilder(
        stream: _combineStream,
        builder:
            (BuildContext context, AsyncSnapshot<List<CombineStream>> snap) {

          if (snap.hasData && !snap.hasError) {
            return ListView.builder(
              itemCount: snap.data.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(snap.data[index].combineUserChats.id),
                  subtitle: Text(myChats[index].combineUserChats.id),
                );
              },
            );
          } else {
            return Center(child: Text("No data"));
          }
        },
      ),
    );
  }
}

class CombineStream {
  final UsersChats combineUserChats;
  final Chat combineChat;

  CombineStream(this.combineUserChats, this.combineChat);
}

class Chat {

  String id;
  String name;

  Chat({String id, String name}) {
    this.id = id;
    this.name = name;
  }

  factory Chat.fromMap(Map data) {
    return Chat(
        name: data['name'] ?? '');
  }

}

class UsersChats {
  String id;
  String lastUpdate;

  UsersChats(
      {this.id,
      this.lastUpdate});

  factory UsersChats.fromMap(MapEntry<dynamic, dynamic> data) {
    return UsersChats(
        id: data.key ?? '',
        lastUpdate: data.value['lastUpdate'] ?? '');
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...