У меня есть простой 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)
из getStream()
. Так что я не уверен, что я делаю неправильно здесь.
Я попытался изменить содержимое .where() на разные ключи документа и добавить ручные значения, и что происходит, так это то, что результаты запроса отображаются на экране эмулятора менее секунды, а затем выбрасываются документы, вызываемые при нулевом исключении.
Любое руководство будет оценено. Спасибо!
Привет, Пскинк, вот что я получил: I/flutter (11906): categSnapshot: AsyncSnapshot<QuerySnapshot>(ConnectionState.waiting, null, null) I/flutter (11906): categSnapshot: AsyncSnapshot<QuerySnapshot>(ConnectionState.active, Instance of 'QuerySnapshot', ноль)
так что у вас есть действительные QuerySnapshot
данные при состоянии соединения != ConnectionState.waiting
, возможно, попробуйте другой print(categSnapshot.data)
непосредственно перед вызовом final categDocs = categSnapshot.data.docs;
тот только что вернул это: I/flutter (11906): null
Если вы примените некоторую проверку ошибок к запросу, Firestore SDK выдаст вам сообщение об ошибке, в котором будет точно указано, что с ним не так.
Я только что нашел ответ здесь: https://stackoverflow.com/a/48698821/2668529
видимо:
Поскольку вы запрашиваете два поля, для этих двух полей должен быть составной индекс. Индексы для отдельных полей создаются автоматически, но составные индексы создаются только по запросу.
Это означает, что вы можете использовать только where() или orderBy(). Вы не можете использовать их оба одновременно без предварительного создания индекса в Firestore.
добавьте
print(categSnapshot)
в качестве первой строки вашегоbuilder
- что вы видите в логах?