Flutter范围误差(指数):无效值:唯一有效值为0:2或范围错误(索引):无效值:有效值范围为空:2

taor4pac  于 2023-02-05  发布在  Flutter
关注(0)|答案(2)|浏览(180)

首先,我是一个业余爱好者,我提前感谢你的帮助!
在我的项目中,我通过这个函数从Cloud Firestore检索数据:

recupereOrganisations(pays) async {

    listeOrganisations.clear();

    try{
      final reponseGet = (await FirebaseFirestore.instance.collection("Organisations").where("Pays", isEqualTo: "Belgium").get())
          .docs.map((e) => e.data());

      reponseGet.forEach((element) {
        listeOrganisations.add(Organisations(
            nom: "${element["Nom"]}",
            activite: "${element["Activité"]}",
            motcle1: "${element["MotCle1"]}",
            motcle2: "${element["MotCle2"]}",
            motcle3: "${element["MotCle3"]}",
            nbpmt: element["NbPmt"],
            photo: "${element["Photo"]}",
            latitude: "${element["Latitude"]}",
            longitude: "${element["Longitude"]}",
            pays: "${element["Pays"]}",
        ));
      });
      listeOrganisations.sort((a,b) => a.nbpmt!.compareTo(b.nbpmt!));

      listeOrganisations.forEach((element) {
        print("Le nom est : ${element.nom} et le nombre de paiements est de ${element.nbpmt}");
      });// this is a test to ensure everything is working (test successful)

      return listeOrganisations;
    }
    catch(e){
      print(e);
    }
  }

所以,我的列表是用存储在Firebase中的数据填充的,然后列表被排序,直到这里。
当我尝试在我的构建框架中“使用”列表时出现了问题。

@override
  Widget build(BuildContext context) {
    //recupereOrganisations("Belgium");
    //print(" l'élément à imprimer est ${recupereOrganisations[2].activite}");
    return Scaffold(
      backgroundColor: noirFond,
      appBar: appbar,
      body: widgetListeTrieePmt(context),
    );
  }

  Widget widgetListeTrieePmt (context){
    recupereOrganisations("Belgium");
    print(" test sur la liste ${listeOrganisations[2].activite}");
      return Container(

在return语句之后,它与错误不再相关...
错误出现在我执行打印的行中,我从错误消息中了解到,当我尝试打印时,列表“listOrganisations”为空。
因为函数可以工作,所以我猜它来自异步的东西,代码在异步函数完成之前继续...
我尝试了几种方法,但都没有带来解决方案:

  • 在生成的返回中放置一个条件:如果((列出组织== null)||(listeOrganisation.isEmpty))并仅在为false时调用小部件
  • 与之前相同,但支架主体除外
  • 调用init中的函数(并添加一个.then((value)=〉setState列表
  • 在函数的末尾放置一个setSate(在那里似乎会使函数循环,因为列表的打印(foreach循环)不会停止重复。
  • ...

所以,我被困住了。
提前感谢您的帮助!
贝尔纳

dgtucam1

dgtucam11#

错误来自print语句

print(" test sur la liste ${listeOrganisations[2].activite}");

你试图访问一个数组中不存在的索引。记住dart有一个从零开始的数组索引,列表中的第一项的索引为0。
你可以在尝试访问数组中的任何项之前检查数组是否为空。
例如

if(liseOrganisations.isNotEmpty){
  print(" test sur la liste ${listeOrganisations[0].activite}");
}

在本例中,我访问的是数组的第一项。
在您要访问数组中的第三个项目的情况下,您需要检查数组是否最多有3个项目

if(liseOrganisations.length >= 3){
  print(" test sur la liste ${listeOrganisations[2].activite}");
}
rqenqsqc

rqenqsqc2#

我找到了一个解决方案,问题是来自异步任务。我把一个布尔值(donneesRecues)初始化为false,然后调用init中的recupreOrganisation函数。然后将布尔值设置为true。下面是代码:

void initState() {
    // TODO: implement initState
    recupereOrganisations("Belgium").then((value) {
      setState(() {
        donneesRecues = true;
      });
    });
    super.initState();
  }

之后,在构建中,我返回一个带有Container作为子容器的Scaffold,并且对于这个Container的子容器,我在布尔值上设置了一个条件:

return Scaffold(
      backgroundColor: noirFond,
      appBar: appbar,
      body: Container(
        alignment: Alignment.center,
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        child : (donneesRecues==false)? onPatiente(context): onAffiche(context),
      ),
    );

onPatiente(上下文)显示等待页面,onAffiche(上下文)执行我想执行的操作。
感谢那些花时间回答我的人!
贝尔纳

相关问题