无法将 GetBuilder<GamesController> 小部件标记为需要构建,因为框架已经在处理中

GetBuilder<GamesController> widget cannot be marked as needing to build because the framework is already in the process

我试图从 json 获取数据,我遇到了一些错误,但我不知道为什么。

我收到这个错误:

E/flutter ( 4560): [ERROR:flutter/lib/ui/ui_dart_state.cc(207)] Unhandled Exception: setState() or markNeedsBuild() called during build.
E/flutter ( 4560): This GetBuilder<GamesController> widget cannot be marked as needing to build because the framework is already in the process of building widgets.  A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
E/flutter ( 4560): The widget on which setState() or markNeedsBuild() was called was:
E/flutter ( 4560):   GetBuilder<GamesController>
E/flutter ( 4560): The widget which was currently being built when the offending call was made was:
E/flutter ( 4560):   _BodyBuilder
E/flutter ( 4560): #0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4305:11)
E/flutter ( 4560): #1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4320:6)
E/flutter ( 4560): #2      State.setState (package:flutter/src/widgets/framework.dart:1108:15)

和我的代码:

Future getLeagues(var sportCategory) async {
//update();
myArrayA.clear();
myArrayB.clear();
myArrayC.clear();
myArrayCC.clear();
myArrayD.clear();
myArrayE.clear();
myArrayF.clear();
myArrayG.clear();
myArrayGG.clear();
myArrayH.clear();
myArrayII.clear();
myArrayI.clear();
myArrayJ.clear();
myArrayK.clear();
myArrayL.clear();
myArrayM.clear();
myArrayN.clear();
myArrayO.clear();
myArrayOO.clear();
myArrayP.clear();
myArrayR.clear();
myArrayS.clear();
myArraySS.clear();
myArrayT.clear();
myArrayU.clear();
myArrayUU.clear();
myArrayV.clear();
myArrayY.clear();
myArrayZ.clear();

leagueList.clear();
leagueEnum =  LeagueEnum.Loading;
update();


_apiServices.getLeagues(sportCategory).then((value) {
  if (value != false) {
    allLeagues = LeagueWCountryModel.fromJson(value);
    //A
    if (allLeagues.others.a != null)
      allLeagues.others.a.forEach((element) {
        allCountriesA.contains(element.category.name)
            ? null
            : allCountriesA.add(element.category.name);
      });
    //B
    if (allLeagues.others.b != null)
      allLeagues.others.b.forEach((element) {
        allCountriesB.contains(element.category.name)
            ? null
            : allCountriesB.add(element.category.name);
      });
    //C

    if (allLeagues.others.c != null)
      allLeagues.others.c.forEach((element) {
        allCountriesC.contains(element.category.name)
            ? null
            : allCountriesC.add(element.category.name);
      });
    //Ç
    if (allLeagues.others.cc != null)
      allLeagues.others.cc.forEach((element) {
        allCountriesCC.contains(element.category.name)
            ? null
            : allCountriesCC.add(element.category.name);
      });
    //D
    if (allLeagues.others.d != null)
      allLeagues.others.d.forEach((element) {
        allCountriesD.contains(element.category.name)
            ? null
            : allCountriesD.add(element.category.name);
      });
    //E
    if (allLeagues.others.e != null)
      allLeagues.others.e.forEach((element) {
        allCountriesE.contains(element.category.name)
            ? null
            : allCountriesE.add(element.category.name);
      });
    //F
    if (allLeagues.others.f != null)
      allLeagues.others.f.forEach((element) {
        allCountriesF.contains(element.category.name)
            ? null
            : allCountriesF.add(element.category.name);
      });
    //G
    if (allLeagues.others.g != null)
      allLeagues.others.g.forEach((element) {
        allCountriesG.contains(element.category.name)
            ? null
            : allCountriesG.add(element.category.name);
      });
    //GG
    if (allLeagues.others.gg != null) if (allLeagues.others.gg != null)
      allLeagues.others.gg.forEach((element) {
        allCountriesGG.contains(element.category.name)
            ? null
            : allCountriesGG.add(element.category.name);
      });
    //H
    if (allLeagues.others.h != null)
      allLeagues.others.h.forEach((element) {
        allCountriesH.contains(element.category.name)
            ? null
            : allCountriesH.add(element.category.name);
      });

    //II
    if (allLeagues.others.ii != null)
      allLeagues.others.ii.forEach((element) {
        allCountriesII.contains(element.category.name)
            ? null
            : allCountriesII.add(element.category.name);
      });
    //İ
    if (allLeagues.others.i != null)
      allLeagues.others.i.forEach((element) {
        allCountriesI.contains(element.category.name)
            ? null
            : allCountriesI.add(element.category.name);
      });
    //J
    if (allLeagues.others.j != null)
      allLeagues.others.j.forEach((element) {
        allCountriesJ.contains(element.category.name)
            ? null
            : allCountriesJ.add(element.category.name);
      });
    //K
    if (allLeagues.others.k != null)
      allLeagues.others.k.forEach((element) {
        allCountriesK.contains(element.category.name)
            ? null
            : allCountriesK.add(element.category.name);
      });
    //L
    if (allLeagues.others.l != null)
      allLeagues.others.l.forEach((element) {
        allCountriesL.contains(element.category.name)
            ? null
            : allCountriesL.add(element.category.name);
      });
    //İ
    if (allLeagues.others.m != null)
      allLeagues.others.m.forEach((element) {
        allCountriesM.contains(element.category.name)
            ? null
            : allCountriesM.add(element.category.name);
      });
    //N
    if (allLeagues.others.n != null)
      allLeagues.others.n.forEach((element) {
        allCountriesN.contains(element.category.name)
            ? null
            : allCountriesN.add(element.category.name);
      });
    //O
    if (allLeagues.others.o != null) if (allLeagues.others.o != null)
      allLeagues.others.o.forEach((element) {
        allCountriesO.contains(element.category.name)
            ? null
            : allCountriesO.add(element.category.name);
      });
    //OO
    if (allLeagues.others.oo != null)
      allLeagues.others.oo.forEach((element) {
        allCountriesOO.contains(element.category.name)
            ? null
            : allCountriesOO.add(element.category.name);
      });
    //P
    if (allLeagues.others.p != null)
      allLeagues.others.p.forEach((element) {
        allCountriesP.contains(element.category.name)
            ? null
            : allCountriesP.add(element.category.name);
      });
    //R
    if (allLeagues.others.r != null)
      allLeagues.others.r.forEach((element) {
        allCountriesR.contains(element.category.name)
            ? null
            : allCountriesR.add(element.category.name);
      });
    //S
    if (allLeagues.others.s != null)
      allLeagues.others.s.forEach((element) {
        allCountriesS.contains(element.category.name)
            ? null
            : allCountriesS.add(element.category.name);
      });
    //SS
    if (allLeagues.others.ss != null) if (allLeagues.others.ss != null)
      allLeagues.others.ss.forEach((element) {
        allCountriesSS.contains(element.category.name)
            ? null
            : allCountriesSS.add(element.category.name);
      });
    //T
    if (allLeagues.others.t != null)
      allLeagues.others.t.forEach((element) {
        allCountriesT.contains(element.category.name)
            ? null
            : allCountriesT.add(element.category.name);
      });
    //U
    if (allLeagues.others.u != null)
      allLeagues.others.u.forEach((element) {
        allCountriesU.contains(element.category.name)
            ? null
            : allCountriesU.add(element.category.name);
      });
    //Ü
    if (allLeagues.others.uu != null) if (allLeagues.others.uu != null)
      allLeagues.others.uu.forEach((element) {
        allCountriesUU.contains(element.category.name)
            ? null
            : allCountriesUU.add(element.category.name);
      }); //V
    if (allLeagues.others.v != null)
      allLeagues.others.v.forEach((element) {
        allCountriesV.contains(element.category.name)
            ? null
            : allCountriesV.add(element.category.name);
      }); //Y
    if (allLeagues.others.y != null)
      allLeagues.others.y.forEach((element) {
        allCountriesY.contains(element.category.name)
            ? null
            : allCountriesY.add(element.category.name);
      }); //İ
    if (allLeagues.others.z != null)
      allLeagues.others.z.forEach((element) {
        allCountriesZ.contains(element.category.name)
            ? null
            : allCountriesZ.add(element.category.name);
      });
    //---
    if (allLeagues.others.a != null)
      allCountriesA.forEach((element) => {
            myFilterData = allLeagues.others.a.where((Top x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayA.add(myData)
          });

    if (allLeagues.others.b != null)
      allCountriesB.forEach((element) => {
            myFilterData = allLeagues.others.b.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayB.add(myData)
          });

    if (allLeagues.others.c != null)
      allCountriesC.forEach((element) => {
            myFilterData = allLeagues.others.c.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayC.add(myData)
          });

    if (allLeagues.others.cc != null)
      allCountriesCC.forEach((element) => {
            myFilterData = allLeagues.others.cc.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayC.add(myData)
          });
    if (allLeagues.others.d != null)
      allCountriesD.forEach((element) => {
            myFilterData = allLeagues.others.d.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayD.add(myData)
          });
    if (allLeagues.others.e != null)
      allCountriesE.forEach((element) => {
            myFilterData = allLeagues.others.e.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayE.add(myData)
          });

    if (allLeagues.others.f != null)
      allCountriesF.forEach((element) => {
            myFilterData = allLeagues.others.f.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayF.add(myData)
          });
    if (allLeagues.others.g != null)
      allCountriesG.forEach((element) => {
            myFilterData = allLeagues.others.g.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayG.add(myData)
          });
    if (allLeagues.others.gg != null)
      allCountriesGG.forEach((element) => {
            myFilterData = allLeagues.others.gg.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayGG.add(myData)
          });
    if (allLeagues.others.h != null)
      allCountriesH.forEach((element) => {
            myFilterData = allLeagues.others.h.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayH.add(myData)
          });

    if (allLeagues.others.ii != null) if (allLeagues.others.ii != null)
      allCountriesII.forEach((element) => {
            myFilterData = allLeagues.others.ii.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayII.add(myData)
          });
    if (allLeagues.others.i != null)
      allCountriesI.forEach((element) => {
            myFilterData = allLeagues.others.i.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayI.add(myData)
          });
    if (allLeagues.others.j != null)
      allCountriesJ.forEach((element) => {
            myFilterData = allLeagues.others.j.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayJ.add(myData)
          });
    if (allLeagues.others.k != null)
      allCountriesK.forEach((element) => {
            myFilterData = allLeagues.others.k.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayK.add(myData)
          });
    if (allLeagues.others.l != null)
      allCountriesL.forEach((element) => {
            myFilterData = allLeagues.others.l.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayL.add(myData)
          });
    if (allLeagues.others.m != null)
      allCountriesM.forEach((element) => {
            myFilterData = allLeagues.others.m.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayM.add(myData)
          });
    if (allLeagues.others.n != null)
      allCountriesN.forEach((element) => {
            myFilterData = allLeagues.others.n.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayN.add(myData)
          });
    if (allLeagues.others.o != null)
      allCountriesO.forEach((element) => {
            myFilterData = allLeagues.others.o.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayO.add(myData)
          });
    if (allLeagues.others.oo != null)
      allCountriesOO.forEach((element) => {
            myFilterData = allLeagues.others.oo.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayOO.add(myData)
          });
    if (allLeagues.others.p != null)
      allCountriesP.forEach((element) => {
            myFilterData = allLeagues.others.p.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayP.add(myData)
          });
    if (allLeagues.others.r != null)
      allCountriesR.forEach((element) => {
            myFilterData = allLeagues.others.r.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayR.add(myData)
          });
    if (allLeagues.others.s != null)
      allCountriesS.forEach((element) => {
            myFilterData = allLeagues.others.s.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayS.add(myData)
          });
    if (allLeagues.others.ss != null)
      allCountriesSS.forEach((element) => {
            myFilterData = allLeagues.others.ss.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArraySS.add(myData)
          });
    if (allLeagues.others.t != null)
      allCountriesT.forEach((element) => {
            myFilterData = allLeagues.others.t.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayT.add(myData)
          });
    if (allLeagues.others.u != null)
      allCountriesU.forEach((element) => {
            myFilterData = allLeagues.others.u.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayU.add(myData)
          });
    if (allLeagues.others.uu != null)
      allCountriesUU.forEach((element) => {
            myFilterData = allLeagues.others.uu.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayUU.add(myData)
          });
    if (allLeagues.others.v != null)
      allCountriesV.forEach((element) => {
            myFilterData = allLeagues.others.v.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayV.add(myData)
          });
    if (allLeagues.others.y != null)
      allCountriesY.forEach((element) => {
            myFilterData = allLeagues.others.y.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayY.add(myData)
          });
    if (allLeagues.others.z != null)
      allCountriesZ.forEach((element) => {
            myFilterData = allLeagues.others.z.where((x) {
              return x.category.name == element;
            }),
            myData = LeagueTempModel(
                country: element, leagues: myFilterData.toList()),
            myArrayZ.add(myData)
          });

    leagueEnum = LeagueEnum.Loaded;

    update();
  } else {
    print('Ligler çekilirken apide bir sorun oluştu..');
    leagueEnum = LeagueEnum.Error;

    update();
  }
});

在真实设备中,发生错误1,在模拟器中,发生错误2。有时我只看到加载屏幕,我不明白为什么。

我不明白为什么会这样,我该如何解决这个问题?请帮帮我。谢谢。

从错误来看,您似乎在 widget 仍在构建或忙于构建时调用了 setState(本质上是重建)。

我过去也遇到过类似的问题。一种解决方法是将导致错误的构建延迟几毫秒,以便当前构建可以完成。我猜这发生在 update() 方法中。 所以只需将 update() 替换为以下内容即可。

Future.delayed(Duration(milliseconds: 20),(){update();});

也可能只是旁注,因为您没有 post 完整示例,请确保不要在 build 方法中调用 getLeague(),因为基本上只会成为一个无限循环。重建并刷新数据。 而是将它放在有状态小部件的 onInit 方法中。