如何从目录中获取文件列表并将其传递给ListView?

时间:2018-05-25 03:52:00

标签: dart flutter

我从用户的文件夹中获取文件列表。我传输到ListView.builder的文件的名称。它的工作,但我认为,这是糟糕的架构。

高频率的方法_getFilesFromDir()调用。

如何正确生成列表,以便在不更改文件列表的情况下更新界面?

class CharacteristList extends StatefulWidget {
  @override
  _CharacteristListState createState() => new _CharacteristListState();
}    
class _CharacteristListState extends State<CharacteristList> {
  List<String> filesList = new List<String>();
  List<String> filesL = new List<String>();
  @override    
  void initState() {
    super.initState();
    filesList = [];
  }    
  Future<List<String>> _getFilesFromDir() async{
    filesL = await FilesInDirectory().getFilesFromDir();
    setState(() {
      filesList = filesL;
    });
    return filesList;
  }    
  _getFilesCount(){
    _getFilesFromDir();
    int count = filesList.length;
    return count;
  }    
  @override
  Widget build(BuildContext context) {    
    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Список документов'),
      ),
      body: new Column(
        children: <Widget>[
          new Expanded(
              child: new ListView.builder(
                //TODO не успевает сформировать список файлов
                itemCount: _getFilesCount(),
                itemBuilder: (context, index){
                  return new CharacteristListItem(filesList[index]);
                },
              ),
          ),
        ],
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          Navigator.push(context,
              new MaterialPageRoute(builder: (context)
          => new StartScreen()),
          );},
        child: new Icon(Icons.add),
      ),
    );
  }    
}

3 个答案:

答案 0 :(得分:0)

请勿在{{1​​}}中致电_getFilesCount()。可以非常频繁地调用build()。在build()中调用它并存储结果,而不是一遍又一遍地重读。

答案 1 :(得分:0)

我改变了类的架构 - 我使用了FutureBuilder。

class _CharacteristListState extends State<CharacteristList> {

  @override
  Widget build(BuildContext context) {

    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Список документов'),
      ),
      body: new Center(
        child: new Column(
          children: <Widget>[
            new FutureBuilder(
                future: _inFutureList(),
                builder: (BuildContext context, AsyncSnapshot snapshot) {
                  if(snapshot.connectionState == ConnectionState.waiting){
                    return new Text('Data is loading...');
                  }
                  else{
                    return customBuild(context, snapshot);
                  }
                }
                )
          ],
        ),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          Navigator.push(context,
              new MaterialPageRoute(builder: (context)
          => new StartScreen()),
          );},
        child: new Icon(Icons.add),
      ),
    );
  }

  Widget customBuild(BuildContext context, AsyncSnapshot snapshot){
    List<String> values = snapshot.data;
    return new Container(
      child: new Expanded(
        child: new ListView.builder(
          itemCount: values.length,
          itemBuilder: (context, index){
            return new CharacteristListItem(values[index]);
          },
        ),
      )
    );
  }

  Future<List<String>>_inFutureList() async{
    var filesList = new List<String>();
    filesList = await FilesInDirectory().getFilesFromDir();
    await new Future.delayed(new Duration(milliseconds: 500));
    return filesList;
  }

}

答案 2 :(得分:0)

  // add dependancy in pubspec.yaml
 path_provider:

 import 'dart:io' as io;
    import 'package:path_provider/path_provider.dart';

    //Declare Globaly
      String directory;
      List file = new List();
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        _listofFiles();
      }

    // Make New Function
    void _listofFiles() async {
        directory = (await getApplicationDocumentsDirectory()).path;
        setState(() {
          file = io.Directory("$directory/resume/").listSync();  //use your folder name insted of resume.
        });
      }

    // Build Part
    @override
      Widget build(BuildContext context) {
        return MaterialApp(
          navigatorKey: navigatorKey,
          title: 'List of Files',
          home: Scaffold(
            appBar: AppBar(
              title: Text("Get List of Files with whole Path"),
            ),
            body: Container(
              child: Column(
                children: <Widget>[
                  // your Content if there
                  Expanded(
                    child: ListView.builder(
                        itemCount: file.length,
                        itemBuilder: (BuildContext context, int index) {
                          return Text(file[index].toString());
                        }),
                  )
                ],
              ),
            ),
          ),
        );
      }