方法一:您可以使用StreamBuilder来做到这一点。这将在 stream 中的数据发生变化时运行 builder 方法。
下面是我的一个示例项目的代码 sn-p:
StreamBuilder<List<Content>> _getContentsList(BuildContext context) {
final BlocProvider blocProvider = BlocProvider.of(context);
int page = 1;
return StreamBuilder<List<Content>>(
stream: blocProvider.contentBloc.contents,
initialData: [],
builder: (context, snapshot) {
if (snapshot.data.isNotEmpty) {
return ListView.builder(itemBuilder: (context, index) {
if (index < snapshot.data.length) {
return ContentBox(content: snapshot.data.elementAt(index));
} else if (index / 5 == page) {
page++;
blocProvider.contentBloc.index.add(index);
}
});
} else {
return Center(
child: CircularProgressIndicator(),
);
}
});
}
在上面的代码中,StreamBuilder 监听内容的任何变化,最初它是一个空数组并显示 CircularProgressIndicator。一旦我进行 API 调用,获取的数据就会添加到内容数组中,该数组将运行 builder 方法。
当用户向下滚动时,会获取更多内容并将其添加到内容数组中,该数组将再次运行 builder 方法。
在您的情况下,只需要初始加载。但这为您提供了在获取数据之前在屏幕上显示其他内容的选项。
希望这有帮助。
编辑:
在你的情况下,我猜它看起来如下所示:
StreamBuilder<List<Content>>(
stream: account, // stream data to listen for change
builder: (context, snapshot) {
if(account != null) {
return _googleSignIn.signInSilently();
} else {
// show loader or animation
}
});
方法 2: 另一种方法是创建一个 async 方法并从您那里调用它的 initState() 方法,如下所示:
@override
void initState() {
super.initState();
asyncMethod();
}
void asyncMethod() async {
await asyncCall1();
await asyncCall2();
// ....
}