【问题标题】:RangeError when querying for Document in Firebase在 Firebase 中查询 Document 时出现 RangeError
【发布时间】:2020-01-20 09:11:58
【问题描述】:

我正在尝试使用以下方法在 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);
            },
          );
        },
      ),

这可能是什么问题?

【问题讨论】:

    标签: firebase flutter firebase-realtime-database dart


    【解决方案1】:

    只需像这样更改您的代码。

     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中有更多用户时才会执行

    【讨论】:

      【解决方案2】:

      请检查条件 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();
      

      【讨论】:

        猜你喜欢
        • 2015-11-14
        • 2019-07-09
        • 2020-09-01
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 2017-09-23
        • 2012-07-19
        相关资源
        最近更新 更多