【发布时间】:2020-01-22 02:37:10
【问题描述】:
我有一个返回图像目录路径的函数,它执行一些额外的检查,例如目录是否存在,然后它会相应地运行。
这是我的代码:
Future<String> getImagesPath() async {
final Directory appDir = await getApplicationDocumentsDirectory();
final String appDirPath = appDir.path;
final String imgPath = appDirPath + '/data/images';
final imgDir = new Directory(imgPath);
bool dirExists = await imgDir.exists();
if (!dirExists) {
await new Directory(imgPath).create(recursive: true);
}
return imgPath;
}
这段代码按预期工作,但我在从Future 获取价值时遇到问题。
案例场景:
我将数据存储在本地数据库中并尝试在列表视图中显示它。我正在使用FutureBuilder,正如answer 中所解释的那样。每个数据行都有一个与之相连的图像(连接的意思是,图像名称存储在db中)。
在Widget build 方法中,我有这段代码:
@override
Widget build(BuildContext context) {
getImagesPath().then((path){
imagesPath = path;
print(imagesPath); //prints correct path
});
print(imagesPath); //prints null
return Scaffold(
//removed
body: FutureBuilder<List>(
future: databaseHelper.getList(),
initialData: List(),
builder: (context, snapshot) {
return snapshot.hasData
? ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (_, int position) {
final item = snapshot.data[position];
final image = "$imagesPath/${item.row[0]}.jpg";
return Card(
child: ListTile(
leading: Image.asset(image),
title: Text(item.row[1]),
subtitle: Text(item.row[2]),
trailing: Icon(Icons.launch),
));
})
: Center(
child: CircularProgressIndicator(),
);
}));
}
在.then 内移动return Scaffold(.....) 不起作用。因为小部件构建不返回任何内容。
我找到的另一个选项是async/await,但最后,同样的问题,代码如下:
_getImagesPath() async {
return await imgPath();
}
调用_getImagesPath() 返回Future,而不是实际数据。
我相信有很小的逻辑错误,但我自己找不到。
【问题讨论】:
-
你的问题是什么?我在你的代码中没有看到任何
FutureBuilder...所以你是在使用它还是StatefulWidget例如? -
我正在使用
StatefulWidget,我已经分享了完整的代码,如果您需要更多信息,请告诉我。 -
不,在您现在发布的代码中,您使用的是
FutureBuilder,所以我的问题是:它是正确的代码吗?或者你正在使用StatefulWidget? -
我看到你知道如何在代码中使用
FutureBuilder,并且你也知道将_getImagesPath设为异步函数。将这两者结合起来有什么错误吗? -
@pskink 正如我在第一条评论中提到的,我使用的是
StatefulWidget。Widget build方法在StatefulWidget类中。
标签: asynchronous flutter dart async-await future