RangeError при запросе документа в Firebase - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь запросить данные в Firebase следующим способом:

static Future<QuerySnapshot> getUserData(String creatorId) {
    Future<QuerySnapshot> data =  _firestore
        .collection('users')
        .where('creatorId', isEqualTo: creatorId)
        .getDocuments();

    return data;
  }

Затем я пытаюсь получить доступ к данным через этот FutureBuilder:

 body: FutureBuilder(
        future: DatabaseService.getUserData(widget.ride.creatorId),
        //future: DatabaseService.getUserData(widget.ride.creatorId),
        builder: (context, snapshot) {
          // if (!snapshot.hasData) {

          // }
          //User user = User.fromDoc(snapshot.data);

          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(
                backgroundColor: Color(0xff192C43),
                valueColor: AlwaysStoppedAnimation(
                  Color(0xff213a59),
                ),
              ),
            );
          }
          User user = User.fromDoc(snapshot.data.documents[0]);

          return SearchCardItemExtended(user: user, ride: widget.ride,);
        },
      ),

Там всегда только один пользователь с одинаковым creatorId. Вот почему я называю документ [0].

Когда я нажимаю на кнопку, вызывающую FutureBuilder, я получаю следующее исключение:

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following RangeError was thrown building FutureBuilder<QuerySnapshot>(dirty, state: _FutureBuilderState<QuerySnapshot>#cff34):
RangeError (index): Invalid value: Valid value range is empty: 0

The relevant error-causing widget was: 
  FutureBuilder<QuerySnapshot> file:///C:/Users/Paul/AndroidStudioProjects/leaf/leaf/lib/screens/search_card_info.dart:61:13
When the exception was thrown, this was the stack: 
#0      List.[] (dart:core-patch/growable_array.dart:149:60)
#1      _SearchCardInfoState.build.<anonymous closure> (package:leaf/screens/search_card_info.dart:80:59)
#2      _FutureBuilderState.build (package:flutter/src/widgets/async.dart)
#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4334:27)
#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4223:15)
...
════════════════════════════════════════════════════════════════════════════════════════════════════

Очень похожий запрос и FutureBuilder в других местах кода. Это другой FutureBuilder:

body: FutureBuilder(
        future: DatabaseService.searchRides(origin, destination, date, time),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Center(
              child: CircularProgressIndicator(
                backgroundColor: Color(0xff192C43),
                valueColor: AlwaysStoppedAnimation(
                  Color(0xff213a59),
                ),
              ),
            );
          }
          if (snapshot.data.documents.length == 0) {
            return Center(
              child: Text(
                'Uppss...\n'
                'Leider wurden keine passenden Fahrten gefunden.\n'
                'Schau doch später noch mal vorbei.',
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontFamily: 'UbuntuLight',
                  fontSize: 14,
                  color: Color(0xffE6EFE9),
                  height: 1.6,
                ),
              ),
            );
          }
          return ListView.builder(
            physics: new BouncingScrollPhysics(),
            itemCount: snapshot.data.documents.length,
            itemBuilder: (BuildContext context, int index) {
              Ride ride = Ride.fromDoc(snapshot.data.documents[index]);

              return SearchCardItem(num: index, ride: ride);
            },
          );
        },
      ),

В чем здесь проблема?

Ответы [ 2 ]

1 голос
/ 20 января 2020

Jus измените ваш код следующим образом.

 if (snapshot.hasData && snapshot.data.length>0) {
 User user = User.fromDoc(snapshot.data.documents[0]);
                //..Implement what you want here}

Вы сталкиваетесь с этой ошибкой, потому что в firebase нет результата, тогда вы пытаетесь вызвать |0], но нет элемента в 0. У вас есть обернуть это обычным способом. Таким образом, он будет выполнен только тогда, когда в snapshot.data

будет больше пользователя.
0 голосов
/ 20 января 2020

Пожалуйста, проверьте состояние snapshot.data.documents.isEmpty или нет

if(snapshot.data.documents.length!=0){
          User user = User.fromDoc(snapshot.data.documents[0]);

          return SearchCardItemExtended(user: user, ride: widget.ride,);
          } 

          return new Container();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...