首页 > 解决方案 > 当我使用 .where() 时,为什么在我的流构建器上调用 null 文档?

问题描述

我有一个像这样的简单 Streambuilder:

class InventoryScreen extends StatefulWidget {
  @override
  _InventoryScreenState createState() => _InventoryScreenState();
}

class _InventoryScreenState extends State<InventoryScreen> {
  Stream userstream;
  String fuser;

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

  CollectionReference categcollection =
      FirebaseFirestore.instance.collection('categories');

  getStream() async {
    var firebaseUser = FirebaseAuth.instance.currentUser;
    setState(() {
      userstream = categcollection
          .where('userId', isEqualTo: firebaseUser.uid)
          .orderBy('createdAt')
          .snapshots();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: DrawerNavigation(),
      appBar: AppBar(
        centerTitle: true,
        title: Text('Title Here'),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          Navigator.of(context)
              .push(MaterialPageRoute(builder: (context) => NewCategory()));
        },
      ),
      body: StreamBuilder<QuerySnapshot>(
        stream: userstream,
        builder: (ctx, categSnapshot) {          
          if (categSnapshot.connectionState == ConnectionState.waiting) {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
          final categDocs = categSnapshot.data.docs;
          return ListView.builder(
            physics: BouncingScrollPhysics(),
            itemCount: categDocs.length,
            itemBuilder: (context, index) {
              return Card(
                //some code here....
              );
            },
          );
        },
      ),
    );
  }
}

它返回此错误:


════════ Exception caught by widgets library ═══════════════════════════════════
The getter 'docs' was called on null.
Receiver: null
Tried calling: docs
The relevant error-causing widget was
StreamBuilder<QuerySnapshot>
lib\screens\inventory_screen.dart:53
════════════════════════════════════════════════════════════════════════════════

.where('userId', isEqualTo: firebaseUser.uid)如果我删除in ,此代码将完美运行getStream()。所以我不确定我在这里做错了什么。

我尝试将 .where() 的内容更改为不同的文档键并添加手动值,发生的情况是它将在模拟器屏幕上显示查询结果不到一秒钟,然后抛出 docs 被调用空异常。

任何指导将不胜感激。谢谢!

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


我刚刚在这里找到了答案: https ://stackoverflow.com/a/48698821/2668529

显然:

由于您要查询两个字段,因此这两个字段需要有一个复合索引。单个字段的索引是自动创建的,但复合索引仅在您请求时才会创建。

这意味着您只能使用 where() 或 orderBy()。如果不先在 Firestore 中创建索引,就不能同时使用它们。


推荐阅读