我正在寻找一种在InitState方法上加载异步数据的方法,在build方法运行之前,我需要一些数据。我正在使用GoogleAuth代码,并且需要执行构建方法,直到Stream运行为止。
我的initState方法是:
@override void initState () { super.initState(); _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) { setState(() { _currentUser = account; }); }); _googleSignIn.signInSilently(); }
我将不胜感激任何反馈。
您可以使用 StreamBuilder* 做到这一点。每当 流中 的数据更改时,这将运行 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调用,提取的数据将添加到contents数组,该数组将运行 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 } });