gpt4 book ai didi

async-await - Flutter:从 UI 调用异步代码的最佳实践

转载 作者:IT老高 更新时间:2023-10-28 12:32:07 27 4
gpt4 key购买 nike

我正在开发一个 Flutter 应用,但想知道从 UI 调用异步代码时我应该怎么做 - 比如说 UI 小部件的构建方法。

例如,我的应用通过服务类连接 Firebase,该服务类使用 Async-Await 样式从 Firebase 获取记录。使用 await 可确保我的服务类的方法在返回 UI 端之前完成记录检索。

但是,由于服务类的方法被标记为异步,它会立即向调用 UI 小部件返回一个 Future,并且 UI 代码会在服务类的方法完成之前继续运行。

是的,我可以为“then()”回调编写代码来处理检索到的记录,但是接下来的小部件内的其他代码呢,并且取决于异步调用的结果?这是否意味着我需要在“then()”子句中嵌入所有内容,并避免在返回 Future 的方法调用之后添加任何执行步骤?这种使用模式有什么建议的模式吗?

@override
Widget build(BuildContext context) {

RealtimeDatabase.getData() // my service class
.then((onValue) {
..... // do something after the async call is completed
}

..... // do something immediately before the async call is done


class RealtimeDatabase {

Future<String> getData() async {

DataSnapshot dataSnapshot = await FirebaseDatabase.instance.reference().orderByKey().once(); // will wait until completed
.....
.....

对不起,如果我在这里的描述不够清晰,欢迎任何建议。

吉米

最佳答案

在 Flutter 中,有一些小部件可以帮助您无缝地执行此操作(例如,FutureBuilderStreamBuilder),您可以根据它们的分辨率控制要渲染的内容。

FutureBuilder 示例:

Widget build(BuildContext context) {
return new FutureBuilder(
future: FirebaseDatabase.instance.reference().child("node"),
builder: (BuildContext context, AsyncSnapshot snapshot) {
return snapshot.hasData? new Scaffold(
///start building your widget tree
):new CircularProgressIndicator(); ///load until snapshot.hasData resolves to true
},);
}

StreamBuilder 的示例:

class Database {

DatabaseReference _refProfile = FirebaseDatabase.instance.reference().child(
"profiles");

getProfiles() => _refProfile.onValue; }

......

Widget build(BuildContext context) {
return new StreamBuilder<Event>(
stream: _database.getProfiles(), //_database = new Database()
builder: (BuildContext context, AsyncSnapshot<Event> event) {
return event.hasData?new Scaffold(

///build your widget tree
):new CircularProgressIndicator();

/// place holder
}

值得一提的是

FutureBuilder 更适合用于获取一些数据一次并且不关心有一致的连接或跟踪任何变化数据。

而另一方面,StreamBuilder 使您能够继续监听数据,并且您可以根据数据中的任何更新来更新 UI 的状态。

关于async-await - Flutter:从 UI 调用异步代码的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49135632/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com