【发布时间】:2021-09-17 05:29:45
【问题描述】:
所以我有一些关于如何正确使用 FutureBuilder 的问题。我在某处读到我们应该将未来存储在一个变量中,并在 FutureBuilder 而不是未来服务中调用该变量。但是我们如何初始化那个变量的初始值呢?当我厌倦了这个时,它总是给LateInitializationError: Field '_dataFuture@28307501' has not been initialized.,应该等到数据加载完毕。
late Future<List<TransaksiResp>> _dataFuture;
@override
void initState() {
super.initState();
transaksiService = TransaksiService();
getUserPrefs().then((value) {
setState(() {
_dataFuture = transaksiService.getTransaksi(user[2]);});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
Flexible(
child: SizedBox(
child: FutureBuilder<List<TransaksiResp>>(
future: _dataFuture,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if(snapshot.hasError) {
print(snapshot);
return Center(
child: Text("Error"),
);
} else if (snapshot.hasData){
List<TransaksiResp> response = snapshot.data;
return _buildListView(response);
} else {
return Center(
child: Container(),
);
}
},
),
),
)
],
),
);
}
这是从共享首选项中获取用户数据的 getUserPrefs 方法
Future<void> getUserPrefs() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
user = prefs.getStringList("user")!;
setState(() {});
}
【问题讨论】:
-
你应该在
initState中使用_dataFuture = someMethodReturningYourFuture(); -
已经在initState中,在调用
getUserPrefs之后,还是直接在initState?里面调用因为我需要来自getUserPrefs的数据来调用服务 -
不,您在
.then内部分配_dataFuture = ...在调用build方法后调用的回调 - 检查它在build()方法中添加一个print('build')和另一个print('then')内部.then回调 -
基本上你应该使用
_dataFuture = someMethodReturningYourFuture();而不使用任何setState等,只需编写一个返回Future的async方法,更多阅读Asynchronous programming: futures, async, await
标签: flutter