Почему документы вызываются с нулевым значением в моем потоковом конструкторе, когда я использую .where()?

У меня есть простой 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() на разные ключи документа и добавить ручные значения, и что происходит, так это то, что результаты запроса отображаются на экране эмулятора менее секунды, а затем выбрасываются документы, вызываемые при нулевом исключении.

Любое руководство будет оценено. Спасибо!

добавьте print(categSnapshot) в качестве первой строки вашего builder - что вы видите в логах?

pskink 25.12.2020 09:39

Привет, Пскинк, вот что я получил: I/flutter (11906): categSnapshot: AsyncSnapshot<QuerySnapshot>(ConnectionState.waiting, null, null) I/flutter (11906): categSnapshot: AsyncSnapshot<QuerySnapshot>(ConnectionState.active, Instance of 'QuerySnapshot', ноль)

Michael Banawa 25.12.2020 09:42

так что у вас есть действительные QuerySnapshot данные при состоянии соединения != ConnectionState.waiting, возможно, попробуйте другой print(categSnapshot.data) непосредственно перед вызовом final categDocs = categSnapshot.data.docs;

pskink 25.12.2020 09:46

тот только что вернул это: I/flutter (11906): null

Michael Banawa 25.12.2020 09:49

Если вы примените некоторую проверку ошибок к запросу, Firestore SDK выдаст вам сообщение об ошибке, в котором будет точно указано, что с ним не так.

Doug Stevenson 25.12.2020 19:14
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
1
5
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я только что нашел ответ здесь: https://stackoverflow.com/a/48698821/2668529

видимо:

Поскольку вы запрашиваете два поля, для этих двух полей должен быть составной индекс. Индексы для отдельных полей создаются автоматически, но составные индексы создаются только по запросу.

Это означает, что вы можете использовать только where() или orderBy(). Вы не можете использовать их оба одновременно без предварительного создания индекса в Firestore.

Другие вопросы по теме