Flutter:在构建期间调用 setState() 或 markNeedsBuild()

Posted

技术标签:

【中文标题】Flutter:在构建期间调用 setState() 或 markNeedsBuild()【英文标题】:Flutter : setState() or markNeedsBuild() called during build 【发布时间】:2021-01-19 11:00:12 【问题描述】:

实际上,我是 Flutter 的新手。这是我的初始屏幕代码。

  void main() async 
     WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    runApp(MyApp());
    

 class MyApp extends StatelessWidget 

 @override
 Widget build(BuildContext context) 
 return MaterialApp(
 debugShowCheckedModeBanner: false,
 title: 'Meet Up',
 theme: ThemeData(
   primarySwatch: Colors.blue,
 ),
   home: IntroScreen(),);




class IntroScreen extends StatefulWidget

@override
_IntroScreenState createState() => _IntroScreenState();


class _IntroScreenState extends State<IntroScreen> 

@override
void initState() 
super.initState();

FirebaseAuth auth =  FirebaseAuth.instance;
if (auth.currentUser != null)
  
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(builder: (context) => Home(uid: auth.currentUser.uid)),
    );
  
else
  
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(builder: (context) => SignUp()),
    );
   

 

 @override
 Widget build(BuildContext context) 
 return new SplashScreen(
      seconds: 5,
      title: new Text('Welcome To Meet up!',
      style: new TextStyle(
          fontWeight: FontWeight.bold,
          fontSize: 20.0
      ),),
    image: Image.asset('assets/images/dart.png',fit:BoxFit.scaleDown),
    backgroundColor: Colors.white,
    styleTextUnderTheLoader: new TextStyle(),
    photoSize: 100.0,
    onClick: ()=>print("flutter"),
    loaderColor: Colors.red
);


我遇到以下错误:

在构建 Builder 时抛出了以下断言: 在构建期间调用 setState() 或 markNeedsBuild()。 这个 Overlay 小部件不能被标记为需要构建,因为框架已经在 构建小部件的过程。可以在构建阶段将小部件标记为需要构建 仅当其祖先之一当前正在建造时。这个例外是允许的,因为框架 在孩子之前构建父小部件,这意味着将始终构建脏后代。 否则,框架可能不会在此构建阶段访问此小部件。 调用 setState() 或 markNeedsBuild() 的小部件是: 叠加层-[LabeledGlobalKey#5e01c]

请帮我解决这个错误。

【问题讨论】:

@SingleSoul 有解决这个问题的办法吗? 【参考方案1】:

尝试在 initState 中添加一个计时器,例如

  @override
  void initState() 
    Timer(new Duration(seconds: 2), () 
     .
     .
     .
    );
    super.initState();
  

【讨论】:

以上是关于Flutter:在构建期间调用 setState() 或 markNeedsBuild()的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 在构建期间调用 setState() 或 markNeedsBuild()

在构建期间调用 setState() 或 markNeedsBuild() - Flutter

Flutter:在构建错误期间调用了 setState() 或 markNeedsBuild()

Flutter :setState() 或 markNeedsBuild() 在构建期间调用

Flutter 错误 - 在构建期间调用了 setState() 或 markNeedsBuild()

如何修复 Flutter 构建问题期间调用的 setState