方法一: 您可以使用StreamBuilder实现此功能。这将在stream中的数据更改时运行builder方法。
以下是我一个示例项目中的代码片段:
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,
builder: (context, snapshot) {
if(account != null) {
return _googleSignIn.signInSilently();
} else {
}
});
方法 2:另一种方法是创建一个 async
方法,并像下面展示的那样从您的 initState()
方法中调用它:
@override
void initState() {
super.initState();
asyncMethod();
}
void asyncMethod() async {
await asyncCall1();
await asyncCall2();
}
StreamBuilder
是正确的解决方案。 - Rémi RousseletinitState()
只会被调用一次,那么在其中使用setState()
有意义吗? - pragmateek