Flutter 在Flatter中,如何确保用于构建GridView的数据可用?
我在应用程序目录中存储了一组文件。每个都包含要在GridView小部件中显示的UINT8列表数据。由于Dart的异步特性,如何确保在小部件构建开始之前获得可用的文件数和文件名。由于文件/名称的数量是动态的,我必须扫描应用程序目录。下面是部分代码片段。我将获取文件名和生成Uint8List数据集的功能放在initState中,但有时无法正常工作。感谢您对这个问题的任何反馈Flutter 在Flatter中,如何确保用于构建GridView的数据可用?,flutter,listview,dart,asynchronous,gridview,Flutter,Listview,Dart,Asynchronous,Gridview,我在应用程序目录中存储了一组文件。每个都包含要在GridView小部件中显示的UINT8列表数据。由于Dart的异步特性,如何确保在小部件构建开始之前获得可用的文件数和文件名。由于文件/名称的数量是动态的,我必须扫描应用程序目录。下面是部分代码片段。我将获取文件名和生成Uint8List数据集的功能放在initState中,但有时无法正常工作。感谢您对这个问题的任何反馈 class _PageAState extends State<PageA> { List<Str
class _PageAState extends State<PageA> {
List<String> fileNames=[];
List<Uint8List> uIntData
int numFiles=0;
/*get file names (starting with "XYZ", stored in App directory*/
_getFileName() async {
fileNames = [];
String keyWord = "XYZ";
List files = new List();
// var lock = new Lock(); // try https://pub.dev/packages/synchronized package with no luck
// await lock.synchronized(() async {
String directory = (await getApplicationDocumentsDirectory()).path;
files = Directory("$directory").listSync();
for (FileSystemEntity f in files) {
if (f.path.contains(keyWord)) {
fileNames.add(f.path);
print(f.path);
}
}
// });
}
/*get a set of Uint8List data */
_getImageData() async {
await _getFileName();
numFiles = fileNames.length;
for (int i = 0; i < numFiles; i++) {
Uint8List dData =
(await rootBundle.load(fileNames[i])).buffer.asUint8List();
uIntData.add(dData);
}
}
@override
initState() {
super.initState();
/** load Uint8List data set async ***/
_getImageData();
}
Widget buildGridView(BuildContext context) {
var orientation = Orientation.portrait;
return (GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: (orientation == Orientation.portrait) ? 2 : 3),
// how to make sure that numFiles is properly set ???
itemCount: numFiles,
itemBuilder: (BuildContext ctx, int index) {
return Padding(
padding: EdgeInsets.all(20),
child: Stack(children: <Widget>[
GestureDetector(
child: Card(
shape: Border.all(
width: 5,
),
elevation: 20,
color: Colors.greenAccent,
child: SizedBox(
child: (uIntData.isEmpty || uIntData[index] == null)
? CircularProgressIndicator()
: Image.memory(uIntData[index]),
width: 120,
height: 120,
),
),
onTap: () {
},
onLongPress: () {
},
),
]),
);
},
));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: buildGridView(context),
);
}
}
class\u页面状态扩展状态{
列出文件名=[];
列表uIntData
int numFiles=0;
/*获取存储在应用程序目录中的文件名(以“XYZ”开头)*/
_getFileName()异步{
文件名=[];
字符串关键字=“XYZ”;
列表文件=新列表();
//var lock=new lock();//试试看https://pub.dev/packages/synchronized 不走运的包裹
//等待锁定。已同步(()异步{
字符串目录=(等待getApplicationDocumentsDirectory()).path;
files=目录(“$Directory”).listSync();
for(文件中的文件系统性f){
if(f.path.contains(关键字)){
添加(f.path);
打印(f.path);
}
}
// });
}
/*获取一组Uint8List数据*/
_getImageData()异步{
等待_getFileName();
numFiles=fileNames.length;
对于(int i=0;i
必须使用uIntData列表的长度对uIntData进行初始化,例如:
声明:
List<Uint8List> uIntData = [];
此外,您可以仅用一种方法重构\u getFileName和\u getImageData,因为当您只能使用一种方法时,您将2用于bucle。必须使用uIntData和itemCount使用uIntData列表的长度,例如: 声明:
List<Uint8List> uIntData = [];
此外,您可以仅用一种方法重构\u getFileName和\u getImageData,因为您将2用于bucle,而您只能使用一种方法。在检索完所有文件后,再次尝试刷新UI:
@override
initState() {
super.initState();
/** load Uint8List data set async ***/
_getImageData().then((){
setState(() {});
});
}
检索所有文件后,再次尝试刷新UI:
@override
initState() {
super.initState();
/** load Uint8List data set async ***/
_getImageData().then((){
setState(() {});
});
}