firebase - 当我使用 .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 被调用空异常。
任何指导将不胜感激。谢谢!
解决方案
我刚刚在这里找到了答案: https ://stackoverflow.com/a/48698821/2668529
显然:
由于您要查询两个字段,因此这两个字段需要有一个复合索引。单个字段的索引是自动创建的,但复合索引仅在您请求时才会创建。
这意味着您只能使用 where() 或 orderBy()。如果不先在 Firestore 中创建索引,就不能同时使用它们。
推荐阅读
- android - recyclerview 不使用 kotlin 在片段中显示 sqlite 产品数据?
- mysql - 这两张表需要什么样的关系?
- c# - 根据 C# 中相邻列的输入值更新数据库中的列(剃须刀页面)
- mysql - 子查询中存在的情况
- c - 如何将 char* 地址发送到函数,以便以十六进制打印
- corda - Corda 4 - 如何将新节点添加到在本地环境中以开发模式运行的现有 Corda 网络?
- javascript - Drupal 未定义 - jQuery (Drupal 8)
- php - 如何将 User::create 方法转换为 json?
- c# - 如何将 IExcelDataReader 值转换为字符串数据类型
- java - JLabel,如何设置坐标