Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在Flatter中,如何确保用于构建GridView的数据可用?_Flutter_Listview_Dart_Asynchronous_Gridview - Fatal编程技术网

Flutter 在Flatter中,如何确保用于构建GridView的数据可用?

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

我在应用程序目录中存储了一组文件。每个都包含要在GridView小部件中显示的UINT8列表数据。由于Dart的异步特性,如何确保在小部件构建开始之前获得可用的文件数和文件名。由于文件/名称的数量是动态的,我必须扫描应用程序目录。下面是部分代码片段。我将获取文件名和生成Uint8List数据集的功能放在initState中,但有时无法正常工作。感谢您对这个问题的任何反馈

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(() {});
});
}