换句话说,不是固定的 15秒,有没有办法告诉它在我的异步功能完成后停止显示?
答案 0 :(得分:1)
如果您将单独的屏幕用于初始屏幕,则可以简单地await
使用async
函数,并使用Navigator.pushReplacement()
打开< strong>主屏幕
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()
来有条件地显示 loader 和 Main UI 。
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"),
);
}
}
希望有帮助。
答案 1 :(得分:0)
在页面中使用FutureBuilder
from here,并在未加载数据时显示初始屏幕图像。