【问题标题】:Flutter delayed function called twiceFlutter 延迟函数调用了两次
【发布时间】:2019-11-01 07:41:05
【问题描述】:

我有一个启动器屏幕,我可以在其中检查我是否有特定数据。根据结果​​我显示不同的屏幕

 void main() => runApp(MyApp());


 class MyApp extends StatelessWidget {
   @override
    Widget build(BuildContext context) {
    return MaterialApp(
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: LauncherScreen()
  );
 }
}


 class LauncherScreen extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 print("build, build");
 Future.delayed(new Duration(milliseconds: 2000), () {
  LocalData localData = LocalData();
  localData.getCity().then((city) {
    if (city != null) {
      Const.city = city;
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => Home()),
      );
    } else {
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => SelectCities()),
      );
    }
  });
});
return Container(
    width: double.infinity,
    height: double.infinity,
     color: Color(GoEngColors.violet));
 }
}

我的LauncherScreen 调用了两次,结果我看到我的HomeSelect city 屏幕出现了两次。

这种行为的原因是什么以及如何解决?谢谢。

【问题讨论】:

    标签: flutter flutter-navigation


    【解决方案1】:

    build 方法可以被多次调用,因此它不是调用初始化过程的正确位置。您应该将您的小部件转换为StatefulWidget(在Android Studio 上按Alt + Enter)并从initState() 调用您的Future.delayed。像这样:

    class LauncherScreen extends StatefulWidget {
      @override
      _LauncherScreenState createState() => _LauncherScreenState();
    }
    
    class _LauncherScreenState extends State<LauncherScreen> {
    
      @override
      void initState() {
        super.initState();
        print("build, build");
        Future.delayed(new Duration(milliseconds: 2000), () {
          LocalData localData = LocalData();
          localData.getCity().then((city) {
            if (city != null) {
              Const.city = city;
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => Home()),
              );
            } else {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => SelectCities()),
              );
            }
          });
        });
      }
    
      @override
      Widget build(BuildContext context) {    
        return Container(width: double.infinity, height: double.infinity, color: Color(GoEngColors.violet));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多