我正在寻找一种在InitState方法上加载异步数据的方法,在构建方法运行之前,我需要一些数据。我使用的是GoogleAuth代码,我需要执行build方法,直到流运行为止。
我的initState方法是:
@override
void initState () {
super.initState();
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
setState(() {
_currentUser = account;
});
});
_googleSignIn.signInSilently();
}
如有任何反馈,我将不胜感激。
方法1:可以使用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侦听内容的任何更改,最初它是一个空数组并显示CircularProgressIndex。一旦我调用API,获取的数据就会添加到内容数组中,这将运行构建器方法。
当用户向下滚动时,会获取更多内容并将其添加到内容数组中,该数组将再次运行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();
// ....
}
从现在起,请使用。然后,符号似乎起作用了:
// ...
@override
initState() {
super.initState();
myAsyncFunction
// as suggested in the comment
// .whenComplete() {
// or
.then((result) {
print("result: $result");
setState(() {});
});
}
//...
您可以创建一个async
方法并在您的initState
中调用它
@override
void initState () {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_){
_asyncMethod();
});
}
_asyncMethod() async {
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
setState(() {
_currentUser = account;
});
});
_googleSignIn.signInSilently();
}
问题内容: 有没有办法用TypeScript语言进行方法重载? 我想实现以下目标: 这是我不想做的一个例子(我真的很讨厌JS中重载hack的那一部分): 问题答案: 根据规范,TypeScript确实支持方法重载,但是它很笨拙,并且包含许多手动检查参数类型的工作。我认为这主要是因为在纯JavaScript中最接近方法重载的地方还包括检查,并且TypeScript尝试不修改实际的方法主体,以避免任何
没有await并且在非异步方法中调用异步方法的行为是什么?我这样问是因为我看到Visual Studio在调用异步方法时没有显示任何警告,好像这是一件非常正常的事情。在这种情况下,异步方法的行为是否像是同步的?
问题内容: 我想知道是否有办法限制cassandra java驱动程序同时执行的查询数量? 当前,我执行许多查询,如下所示: 不幸的是,这可能导致NoHostAvailableException。 谢谢。 问题答案: 您可以使用信号量来限制并发查询的数量: 但是到最后,情况并没有太大的不同:信号量将阻塞(如果使用定时版本的Acquisition,则抛出该信号),而不是在超出容量时得到信号。因此,您
有没有办法(一步一步)在M1 Mac上设置PyCharm?我正在寻找一些一步一步地如何克服口译员的错误。还有一个错误消息发生在我的简单Hello world打印中。 “进程结束,退出代码137(被信号9:SIGKILL中断)”
我有一个PDF文件,里面有海量的xmp元数据,当我用itext7处理它的时候,程序卡在语句查看源代码,发现在Pdffile对象的构造函数中执行了open(null)方法,最后卡在了并且没有避免它的选项,xmp元数据对我来说毫无用处。 有了itextSharp,基于PDF/A上的删除XMP元数据,我可以得到一个没有元数据的pdf文件。 我试图创建PdfReader或PdfDocument的子类,试图
问题内容: 我们正在开发S60版本,该平台具有不错的Python API。 但是,关于Android上的Python尚无任何官方资料,但是由于Jython存在,有没有办法让蛇和机器人一起工作? 问题答案: 一种方法是使用: 开源Python库,用于快速开发利用创新用户界面的应用程序,例如多点触控应用程序。 可在和上运行。你可以在所有受支持的平台上运行相同的代码。