【问题标题】:Stream provider is not filtering data according to where clause that I specified,流提供程序没有根据我指定的 where 子句过滤数据,
【发布时间】:2022-01-05 08:11:05
【问题描述】:

我有一个应该返回当前登录用户的 userData 的流提供程序。它应该获取电子邮件等于当前 user.email 的用户的信息。我猜流提供商会在保存当前用户的电子邮件之前加载数据,因为它会加载所有用户的信息`。那么我应该如何让流提供者等到当前用户的电子邮件被保存。 加载当前用户的函数。

Future<void>loadLoggedUser() async{
  FirebaseAuth.instance
      .userChanges()
      .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      email=user.email;
      userid=user.uid;
      print('User is signed in!');
    }
  });
  notifyListeners();
}

userData 的流提供程序

    Stream<List<UserData>> get UserList {
  return _db.collection('users').where('email', isEqualTo: email)
      .snapshots()
      .map((snapshot) =>
      snapshot.docs
          .map((document) =>
          UserData.fromJson(document.data())).toList()
  );

}

任何帮助将不胜感激

【问题讨论】:

    标签: firebase flutter google-cloud-firestore stream provider


    【解决方案1】:

    如果你愿意,你也可以这样搜索 - 嵌套的 Streambuilder 可以帮助解决这个排序和搜索问题。 第一个StreamBuilder 属于User,第二个属于QuerySnapshot&lt;Map&lt;String, dynamic&gt;&gt;

    StreamBuilder<User?>(
              stream: FirebaseAuth.instance.authStateChanges(),
              builder: (BuildContext context, AsyncSnapshot<User?> snapshot) {
                if (snapshot.hasData) {
                  final String email = snapshot.data!.email;
                  return StreamBuilder(
                    stream: FirebaseFirestore.instance
                        .collection('users')
                        .where('email', isEqualTo: email)
                        .snapshots(),
                    builder: (BuildContext context,
                        AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>
                            snapshot) {
                      if (snapshot.hasData) {
                        final list = snapshot.data!.docs
                            .map((document) => UserData.fromJson(document.data()))
                            .toList();
                        if (list.isNotEmpty) {
                          return ListView.builder(
                            shrinkWrap: true,
                            itemCount: list.length,
                            itemBuilder: (BuildContext context, int index) {
                              final userData = list[index];
                              return Text(userData
                                  .name); // can print properties of userData model
                            },
                          );
                        }
                        return const Text("NO DATA AVAILABLE");
                      }
                      return const Text("Loading");
                    },
                  );
                }
                return const Center(
                  child: Text("logged out"),
                );
              },
            ),
    

    【讨论】:

      【解决方案2】:

      我建议将 getter 变成一个函数并检查用户电子邮件是 null 还是空字符串(取决于您在代码中如何初始化它)。

      Stream<List<UserData>> getUserList(String? email) {
        if (email == null) throw Exception("Email is null");
        return _db
            .collection('users')
            .where('email', isEqualTo: email)
            .snapshots()
            .map((snapshot) => snapshot.docs
                .map((document) => UserData.fromJson(document.data()))
                .toList());
      }
      

      【讨论】:

        猜你喜欢
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-07
        相关资源
        最近更新 更多