RangeError(index):无效值:有效值范围为空:0 -- Flutter -- firebase

mccptt67  于 2023-05-19  发布在  Flutter
关注(0)|答案(1)|浏览(151)

我在更一般的基础上重新创建了这个错误。
这是我的代码:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class Test extends StatefulWidget {
  const Test({Key? key}) : super(key: key);

  @override
  _TestState createState() => _TestState();
}
class _TestState extends State<Test> {

  List<int> intlist = [];
  List<String> stringList = [];

  Future getIDlist() async {
    List<int> list1 = [];
    List<int> list2 = [];
    for (int i = 0; i < 18; i++) {
      var firebaseShop = await FirebaseFirestore.instance
          .collection('Collection')
          .doc('Data')
          .get();
      var dataShop = firebaseShop.data();
      if (dataShop?['x']) { //Data is a boolean
        list1.add(i);
      } else {
        list2.add(i);
      }
    }
    intlist.addAll(list1);
    intlist.addAll(list2);
    stringList = intlist.map((int value) => value.toString()).toList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Text(
        stringList[0],
      ),
    );
  }
}

这是我得到的错误:

Exception caught by widgets library:

The following RangeError was thrown building Test(dirty, state: _TestState#debf0):

**RangeError (index): Invalid value: Valid value range is empty: 0**

只是找不到答案,希望你能帮忙!

tvmytwxo

tvmytwxo1#

您从未调用getIDlist(),这将需要一些时间来获取数据。最好使用FutureBuilder作为将来的方法。
因此stringList保持空列表并发生错误。
对于目前的捷径你可以做的

Future getIDlist() async {
 .....other code
  stringList = intlist.map((int value) => value.toString()).toList();
  setState((){});// to update ui after data fetch complete
}

在渲染文本时,进行数据检查。

stringList.isNotEmpty? Text(stringList[0]) : null,

但为了获得更好的实践,请检查FutureBuilderfirestore/query-data/get-data

相关问题