Flutter 生成错误期间调用了my setState()或markNeedsBuild()。你能帮帮我吗?

Flutter 生成错误期间调用了my setState()或markNeedsBuild()。你能帮帮我吗?,flutter,stream,future,setstate,provider,Flutter,Stream,Future,Setstate,Provider,首先,我必须说,我还研究了有关此错误的其他问题,但没有找到解决方案 我得到一个类似这样的错误: ════════ Exception caught by widgets library ═══════════════════════════════════ The following assertion was thrown building LoginPage(dirty, dependencies: [MediaQuery]): setState() or markNeedsBuild()

首先,我必须说,我还研究了有关此错误的其他问题,但没有找到解决方案

我得到一个类似这样的错误:

════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building LoginPage(dirty, dependencies: [MediaQuery]):
setState() or markNeedsBuild() called during build.

This Overlay 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.
The widget on which setState() or markNeedsBuild() was called was: Overlay-[LabeledGlobalKey<OverlayState>#c8e35]
    state: OverlayState#58ca1(entries: [OverlayEntry#26031(opaque: true; maintainState: false), OverlayEntry#307a6(opaque: false; maintainState: true), OverlayEntry#70b4a(opaque: false; maintainState: false), OverlayEntry#4c25b(opaque: false; maintainState: true)])
The widget which was currently being built when the offending call was made was: LoginPage
The relevant error-causing widget was
LoginPage
lib\…\screens\landing_page.dart:20
When the exception was thrown, this was the stack
#0      Element.markNeedsBuild.<anonymous closure>
package:flutter/…/widgets/framework.dart:4138
#1      Element.markNeedsBuild
package:flutter/…/widgets/framework.dart:4153
#2      State.setState
package:flutter/…/widgets/framework.dart:1287
#3      OverlayState.rearrange
package:flutter/…/widgets/overlay.dart:436
#4      NavigatorState._flushHistoryUpdates
package:flutter/…/widgets/navigator.dart:4043
...


════════ Exception caught by widgets library ═══════════════════════════════════
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 4517 pos 12: '!_debugLocked': is not true.
The relevant error-causing widget was
LoginPage
lib\…\screens\landing_page.dart:20

E/flutter ( 4507): #5      _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter ( 4507): #6      _FutureListener.handleValue (dart:async/future_impl.dart:152:18)
E/flutter ( 4507): #7      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:704:45)
E/flutter ( 4507): #8      Future._propagateToListeners (dart:async/future_impl.dart:733:32)
E/flutter ( 4507): #9      Future._completeWithValue (dart:async/future_impl.dart:539:5)
E/flutter ( 4507): #10     Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:577:7)
E/flutter ( 4507): #11     _rootRun (dart:async/zone.dart:1354:13)
E/flutter ( 4507): #12     _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter ( 4507): #13     _CustomZone.runGuarded (dart:async/zone.dart:1162:7)
E/flutter ( 4507): #14     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1202:23)
E/flutter ( 4507): #15     _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
E/flutter ( 4507): #16     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
 main(List<String> args) async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(
     MultiProvider(
       providers: [
         ChangeNotifierProvider(create:(_)=> AuthService()),
       ],
       child: MyApp()),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
    
    return MaterialApp(
      theme: ThemeData(fontFamily: GoogleFonts.oxanium().fontFamily),
      debugShowCheckedModeBanner: false,
     initialRoute: "/",
      routes: {
        '/': (context) => LandingPage(),
        'login': (context) => LoginPage(),
        'register': (context) => RegisterPage(),
        'game': (context) => GamePage(),
        'main': (context) => MainPage(),
        'profile': (context) => ProfilePage(),
        'beforeQ': (context) => BeforeQuestionPage(),
        'editProfile': (context) => EditProfilePage(),
        'question': (context) => QuestionPage(),
        'shop': (context) => ShopPage(),
      },
    );
  }
}
class LandingPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final auth = Provider.of<AuthService>(context);
    switch (auth.userState) {
      case UserStates.LoggingIn:
        return Scaffold(
          body: Center(
            child: CircularProgressIndicator(),
          ),
        );

      case UserStates.NotLoggedIn:
        return LoginPage();

      case UserStates.LoggedIn:
        return MainPage();

      default:
        return Scaffold(
          body: Center(
            child: CircularProgressIndicator(),
          ),
        );
    }

    
  }
}
════════ widgets库捕获到异常═══════════════════════════════════
生成登录页时抛出了以下断言(脏,依赖项:[MediaQuery]):
在生成过程中调用setState()或markNeedsBuild()。
无法将此覆盖小部件标记为需要构建,因为框架已经在构建小部件的过程中。只有当一个小部件的祖先当前正在构建时,才可以将其标记为需要在构建阶段构建。此异常是允许的,因为框架在子部件之前构建父部件,这意味着将始终构建脏子部件。否则,框架可能不会在构建阶段访问此小部件。
调用setState()或markNeedsBuild()的小部件是:Overlay-[LabeledGlobalKey#c8e35]
状态:OverlyState#58ca1(条目:[OverlyEntry#26031(不透明:真;维护状态:假),OverlyEntry#307a6(不透明:假;维护状态:真),OverlyEntry#70b4a(不透明:假;维护状态:假),OverlyEntry#4c25b(不透明:假;维护状态:真)])
当发出有问题的调用时,当前正在构建的小部件是:LoginPage
导致错误的相关小部件已被删除
登录页
库\…\screens\landing\u页。省道:20
当抛出异常时,这是堆栈
#0 Element.markNeedsBuild。
包:flatter/../widgets/framework.dart:4138
#1.Element.markNeedsBuild
包:flatter/../widgets/framework.dart:4153
#2 State.setState
包:flatter/../widgets/framework.dart:1287
#3.重排
包:flatter/../widgets/overlay.dart:436
#4导航状态。\u刷新历史更新
包:flatter/../widgets/navigator.dart:4043
...
════════ widgets库捕获到异常═══════════════════════════════════
“package:flatter/src/widgets/navigator.dart”:失败的断言:第4517行位置12:“_debugLocked':不是真的。
导致错误的相关小部件已被删除
登录页
库\…\screens\landing\u页。省道:20
E/flatter(4507):#5_CustomZone.runUnary(dart:async/zone.dart:1265:19)
E/flatter(4507):#6 FutureListener.handleValue(dart:async/future_impl.dart:152:18)
E/flatter(4507):#7未来。_传播到侦听器。handleValueCallback(dart:async/Future_impl.dart:704:45)
E/flatter(4507):#8未来。#传播给监听器(dart:async/Future\u impl.dart:733:32)
E/flatter(4507):#9 Future._completewith value(dart:async/Future_impl.dart:539:5)
E/颤振(4507):#10个未来。"异步完成值。(dart:async/future\u impl.dart:577:7)
E/flatter(4507):#11_rootRun(dart:async/zone.dart:1354:13)
E/flatter(4507):#12 _CustomZone.run(dart:async/zone.dart:1258:19)
E/颤振(4507):#13 CustomZone.runguard(dart:async/zone.dart:1162:7)
E/颤振(4507):#14_CustomZone.bindCallbackguared。(dart:async/zone.dart:1202:23)
E/flatter(4507):#15_microtaskLoop(dart:async/schedule_microtask.dart:40:21)
E/flatter(4507):#16 startMicrotaskLoop(dart:async/schedule_microtask.dart:49:5)
我的主要方法是:

════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building LoginPage(dirty, dependencies: [MediaQuery]):
setState() or markNeedsBuild() called during build.

This Overlay 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.
The widget on which setState() or markNeedsBuild() was called was: Overlay-[LabeledGlobalKey<OverlayState>#c8e35]
    state: OverlayState#58ca1(entries: [OverlayEntry#26031(opaque: true; maintainState: false), OverlayEntry#307a6(opaque: false; maintainState: true), OverlayEntry#70b4a(opaque: false; maintainState: false), OverlayEntry#4c25b(opaque: false; maintainState: true)])
The widget which was currently being built when the offending call was made was: LoginPage
The relevant error-causing widget was
LoginPage
lib\…\screens\landing_page.dart:20
When the exception was thrown, this was the stack
#0      Element.markNeedsBuild.<anonymous closure>
package:flutter/…/widgets/framework.dart:4138
#1      Element.markNeedsBuild
package:flutter/…/widgets/framework.dart:4153
#2      State.setState
package:flutter/…/widgets/framework.dart:1287
#3      OverlayState.rearrange
package:flutter/…/widgets/overlay.dart:436
#4      NavigatorState._flushHistoryUpdates
package:flutter/…/widgets/navigator.dart:4043
...


════════ Exception caught by widgets library ═══════════════════════════════════
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 4517 pos 12: '!_debugLocked': is not true.
The relevant error-causing widget was
LoginPage
lib\…\screens\landing_page.dart:20

E/flutter ( 4507): #5      _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter ( 4507): #6      _FutureListener.handleValue (dart:async/future_impl.dart:152:18)
E/flutter ( 4507): #7      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:704:45)
E/flutter ( 4507): #8      Future._propagateToListeners (dart:async/future_impl.dart:733:32)
E/flutter ( 4507): #9      Future._completeWithValue (dart:async/future_impl.dart:539:5)
E/flutter ( 4507): #10     Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:577:7)
E/flutter ( 4507): #11     _rootRun (dart:async/zone.dart:1354:13)
E/flutter ( 4507): #12     _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter ( 4507): #13     _CustomZone.runGuarded (dart:async/zone.dart:1162:7)
E/flutter ( 4507): #14     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1202:23)
E/flutter ( 4507): #15     _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
E/flutter ( 4507): #16     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
 main(List<String> args) async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(
     MultiProvider(
       providers: [
         ChangeNotifierProvider(create:(_)=> AuthService()),
       ],
       child: MyApp()),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
    
    return MaterialApp(
      theme: ThemeData(fontFamily: GoogleFonts.oxanium().fontFamily),
      debugShowCheckedModeBanner: false,
     initialRoute: "/",
      routes: {
        '/': (context) => LandingPage(),
        'login': (context) => LoginPage(),
        'register': (context) => RegisterPage(),
        'game': (context) => GamePage(),
        'main': (context) => MainPage(),
        'profile': (context) => ProfilePage(),
        'beforeQ': (context) => BeforeQuestionPage(),
        'editProfile': (context) => EditProfilePage(),
        'question': (context) => QuestionPage(),
        'shop': (context) => ShopPage(),
      },
    );
  }
}
class LandingPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final auth = Provider.of<AuthService>(context);
    switch (auth.userState) {
      case UserStates.LoggingIn:
        return Scaffold(
          body: Center(
            child: CircularProgressIndicator(),
          ),
        );

      case UserStates.NotLoggedIn:
        return LoginPage();

      case UserStates.LoggedIn:
        return MainPage();

      default:
        return Scaffold(
          body: Center(
            child: CircularProgressIndicator(),
          ),
        );
    }

    
  }
}
main(列表参数)异步{
WidgetsFlutterBinding.ensureInitialized();
等待Firebase.initializeApp();
runApp(
多供应商(
供应商:[
ChangeNotifierProvider(创建:(\u)=>AuthService()),
],
子项:MyApp()),
);
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:主题数据(fontFamily:GoogleFonts.oxanium().fontFamily),
debugShowCheckedModeBanner:false,
初始路径:“/”,
路线:{
“/”:(上下文)=>LandingPage(),
'login':(上下文)=>LoginPage(),
“寄存器”:(上下文)=>RegisterPage(),
“游戏”:(上下文)=>GamePage(),
“main”:(上下文)=>MainPage(),
“profile”:(上下文)=>ProfilePage(),
“beforeQ”:(上下文)=>BeforeQuestionPage(),
“editProfile”:(上下文)=>EditProfilePage(),
“问题”:(上下文)=>QuestionPage(),
'shop':(上下文)=>ShopPage(),
},
);
}
}
我的登录页是这样的:

════════ Exception caught by widgets library ═══════════════════════════════════
The following assertion was thrown building LoginPage(dirty, dependencies: [MediaQuery]):
setState() or markNeedsBuild() called during build.

This Overlay 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.
The widget on which setState() or markNeedsBuild() was called was: Overlay-[LabeledGlobalKey<OverlayState>#c8e35]
    state: OverlayState#58ca1(entries: [OverlayEntry#26031(opaque: true; maintainState: false), OverlayEntry#307a6(opaque: false; maintainState: true), OverlayEntry#70b4a(opaque: false; maintainState: false), OverlayEntry#4c25b(opaque: false; maintainState: true)])
The widget which was currently being built when the offending call was made was: LoginPage
The relevant error-causing widget was
LoginPage
lib\…\screens\landing_page.dart:20
When the exception was thrown, this was the stack
#0      Element.markNeedsBuild.<anonymous closure>
package:flutter/…/widgets/framework.dart:4138
#1      Element.markNeedsBuild
package:flutter/…/widgets/framework.dart:4153
#2      State.setState
package:flutter/…/widgets/framework.dart:1287
#3      OverlayState.rearrange
package:flutter/…/widgets/overlay.dart:436
#4      NavigatorState._flushHistoryUpdates
package:flutter/…/widgets/navigator.dart:4043
...


════════ Exception caught by widgets library ═══════════════════════════════════
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 4517 pos 12: '!_debugLocked': is not true.
The relevant error-causing widget was
LoginPage
lib\…\screens\landing_page.dart:20

E/flutter ( 4507): #5      _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter ( 4507): #6      _FutureListener.handleValue (dart:async/future_impl.dart:152:18)
E/flutter ( 4507): #7      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:704:45)
E/flutter ( 4507): #8      Future._propagateToListeners (dart:async/future_impl.dart:733:32)
E/flutter ( 4507): #9      Future._completeWithValue (dart:async/future_impl.dart:539:5)
E/flutter ( 4507): #10     Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:577:7)
E/flutter ( 4507): #11     _rootRun (dart:async/zone.dart:1354:13)
E/flutter ( 4507): #12     _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter ( 4507): #13     _CustomZone.runGuarded (dart:async/zone.dart:1162:7)
E/flutter ( 4507): #14     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1202:23)
E/flutter ( 4507): #15     _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
E/flutter ( 4507): #16     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
 main(List<String> args) async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(
     MultiProvider(
       providers: [
         ChangeNotifierProvider(create:(_)=> AuthService()),
       ],
       child: MyApp()),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
    
    return MaterialApp(
      theme: ThemeData(fontFamily: GoogleFonts.oxanium().fontFamily),
      debugShowCheckedModeBanner: false,
     initialRoute: "/",
      routes: {
        '/': (context) => LandingPage(),
        'login': (context) => LoginPage(),
        'register': (context) => RegisterPage(),
        'game': (context) => GamePage(),
        'main': (context) => MainPage(),
        'profile': (context) => ProfilePage(),
        'beforeQ': (context) => BeforeQuestionPage(),
        'editProfile': (context) => EditProfilePage(),
        'question': (context) => QuestionPage(),
        'shop': (context) => ShopPage(),
      },
    );
  }
}
class LandingPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final auth = Provider.of<AuthService>(context);
    switch (auth.userState) {
      case UserStates.LoggingIn:
        return Scaffold(
          body: Center(
            child: CircularProgressIndicator(),
          ),
        );

      case UserStates.NotLoggedIn:
        return LoginPage();

      case UserStates.LoggedIn:
        return MainPage();

      default:
        return Scaffold(
          body: Center(
            child: CircularProgressIndicator(),
          ),
        );
    }

    
  }
}
类登录页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
最终认证=提供者(上下文);
开关(auth.userState){
case UserStates.logginging:
返回脚手架(
正文:中(
子对象:CircularProgressIndicator(),
),
);
case UserStates.NotLoggedIn:
返回登录页面();
case UserStates.LoggedIn:
返回主页();
违约:
返回脚手架(
正文:中(
子对象:CircularProgressIndicator(),
),
);
}
}
}

正如我所说,我试图尝试其他问题的解决方案建议,但它无法解决我的问题。这就是我打开这条线的原因。有人知道我的问题有什么解决办法吗?从现在起谢谢你

你可以使用
未来。延迟

Future.delayed(Duration.zero, () async {

    setState(() {});

});

错误在
LoginPage()中。
您可以发布它的代码吗?是的,错误在LoginPage()中。当我重定向到另一个页面时,没有出现错误。谢谢你的回答这是一种代码气味。你刚从重建中走出来。。。为什么您要立即再次重建?表现不佳。在未指明哪些更改值得重建的情况下,切勿调用setState。