只要我们需要主屏幕准备就绪,有没有办法保持启动画面?

Is there a way to keep the splash screen as long as we need for the main screen to be ready?

换句话说,不是固定 15 秒,有没有办法告诉它在我的异步函数完成时停止显示?

在页面中使用 FutureBuilder from here 并在未加载数据时显示初始屏幕图像。

如果您为 启动画面 使用单独的屏幕,您可以简单地 await 您拥有的 async 功能和使用 Navigator.pushReplacement() 打开你的主屏幕

示例:

class SplashScreen extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return SplashScreenState();
  }
}

class SplashScreenState extends State<SplashScreen> {
  @override
  void initState() {
    super.initState();
    handleSplashscreen();
  }

  void handleSplashscreen() async {
    // Wait for async to complete
    await someAsyncFunction();
    // Open Main page
    Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => HomePage(user: null)));
  }

  Future<void> someAsyncFunction() async {
    // Do some Network or other stuff
  }


  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(child: Text("Loading...")),
    );
  }
}

如果您只是在执行异步操作时在同一屏幕上显示加载程序,您可以按照其他人的建议使用 FutureBuilder

或者您可以使用布尔值和 setState().[= 有条件地显示 loaderMain UI 17=]

示例:

class MainPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MainPageState();
  }
}

class MainPageState extends State<MainPage> {
  // Boolean to show/ hide loader
  bool isLoading = true;

  @override
  void initState() {
    super.initState();
    handleAsync();
  }

  void handleAsync() async {
    // Wait for async to complete
    await someAsyncFunction();
    // Open Main page
    setState(() {
      isLoading = false;
    });
  }

  Future<void> someAsyncFunction() async {
    // Do some Network or other stuff
  }

  @override
  Widget build(BuildContext context) {
    // Using isLoading to check whether async function is complete
    return isLoading
        ? Container(
            child: Center(child: Text("Loading...")),
          )
        : Container(
            child: Text("The Actual screen"),
          );
  }
}

希望对您有所帮助。