Android 颤振listview侦听文件目录中的更改并重新创建小部件

Android 颤振listview侦听文件目录中的更改并重新创建小部件,android,flutter,listview,dart,Android,Flutter,Listview,Dart,我正在建立一个下载管理器。listview小部件如何侦听任何更改,例如下载完成时,小部件必须自动刷新,文件删除时,小部件必须自动刷新 这是我的代码,第二个选项卡负责从第一个选项卡启动操作后下载操作。颤振文件管理器包用于获取目录中的数据。分享你对此的想法 import 'dart:io'; import 'package:VideoTube/tabs/share.dart'; import 'package:flutter/material.dart'; import 'package:flutt

我正在建立一个下载管理器。listview小部件如何侦听任何更改,例如下载完成时,小部件必须自动刷新,文件删除时,小部件必须自动刷新

这是我的代码,第二个选项卡负责从第一个选项卡启动操作后下载操作。颤振文件管理器包用于获取目录中的数据。分享你对此的想法

import 'dart:io';
import 'package:VideoTube/tabs/share.dart';
import 'package:flutter/material.dart';
import 'package:flutter_file_manager/flutter_file_manager.dart';
import 'package:percent_indicator/linear_percent_indicator.dart';
import 'package:provider/provider.dart';

class SecondTab extends StatefulWidget {
  SecondTab({Key key}) : super(key: key);

  @override
  _SecondTabState createState() => _SecondTabState();
}

class _SecondTabState extends State<SecondTab> {
  var files;
  ShareModel share;

  _SecondTabState({this.share});

  void getFiles() async {
    //asyn function to get list of files
    //List<StorageInfo> storageInfo = await PathProviderEx.getStorageInfo();
    //var root = storageInfo[0].rootDir; //storageInfo[1] for SD card, geting the root directory
    var fm = FileManager(root: Directory('/storage/emulated/0/VideoTube/')); //
    files = await fm.filesTree(
        //set fm.dirsTree() for directory/folder tree list
        // excludedPaths: ["/storage/emulated/0/VideoTube/"],
        // extensions: ["mp4"] //optional, to filter files, remove to list all,
        //remove this if your are grabbing folder list
        );
    
    
    setState(() {}); //update the UI
  }

  @override
  void initState() {
    getFiles(); //call getFiles() function on initial state.
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    // super.build(context);
    return Scaffold(
        appBar: AppBar(
            title: Text("File/Folder list from SD Card"),
            backgroundColor: Colors.redAccent),
        body: Column(children: <Widget>[
          Flexible(
            flex: 3,
            child: Consumer<ShareProgress>(builder: (context, value, _) {
              return Padding(
                padding: EdgeInsets.all(15.0),
                child: FittedBox(
                  child: LinearPercentIndicator(
                    width: 100.0,
                    fillColor: Colors.white,
                    linearGradient: LinearGradient(
                      colors: [Colors.red, Colors.blue],
                    ),
                    lineHeight: 6.0,
                    percent: value.progress / 100,
                    center: Text(
                      "${value.progress}%",
                      style: TextStyle(fontSize: 5.0),
                    ),
                    trailing: Icon(
                      Icons.mood,
                      size: 5,
                    ),
                    linearStrokeCap: LinearStrokeCap.roundAll,
                    backgroundColor: Colors.grey,
                  ),
                ),
              );
            }

                // Container(
                //   child: Text('downloading.. ${value.progress}'),
                // ),
                ),
          ),
          FutureBuilder(
            builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
              return Flexible(
                flex: 9,
                child: Container(
                  child: files == null
                      ? Text("Searching Files")
                      : ListView.builder(
                          //if file/folder list is grabbed, then show here
                          itemCount: files?.length ?? 0,
                          itemBuilder: (context, index) {
                            return Card(
                                child: ListTile(
                              title: Text(files[index].path.split('/').last),
                              leading: Icon(Icons.video_label),
                              trailing: Icon(
                                Icons.delete,
                                color: Colors.redAccent,
                              ),
                            ));
                          },
                        ),
                ),
              );
            },
          ),
        ]));
  }
}
导入'dart:io';
导入“包:VideoTube/tabs/share.dart”;
进口“包装:颤振/材料.省道”;
导入“package:flatter_file_manager/flatter_file_manager.dart”;
导入“包:百分比指示器/线性百分比指示器.dart”;
导入“包:provider/provider.dart”;
类SecondTab扩展StatefulWidget{
SecondTab({Key}):super(Key:Key);
@凌驾
_SecondTabState createState()=>\u SecondTabState();
}
类_SecondTabState扩展状态{
var文件;
共享模型共享;
_SecondTabState({this.share});
void getFiles()异步{
//asyn函数获取文件列表
//List storageInfo=wait PathProviderEx.getStorageInfo();
//var root=storageInfo[0].rootDir;//storageInfo[1]用于SD卡,获取根目录
var fm=FileManager(根:目录('/storage/emulated/0/VideoTube/')//
files=wait fm.filesTree(
//为目录/文件夹树列表设置fm.dirsTree()
//排除路径:[“/storage/simulated/0/VideoTube/”,
//扩展名:[“mp4”]//可选,要筛选文件,请删除以列出所有文件,
//如果您正在抓取文件夹列表,请删除此项
);
setState((){});//更新UI
}
@凌驾
void initState(){
getFiles();//在初始状态下调用getFiles()函数。
super.initState();
}
@凌驾
小部件构建(构建上下文){
//super.build(上下文);
返回脚手架(
appBar:appBar(
标题:文本(“SD卡中的文件/文件夹列表”),
背景颜色:颜色。红色调),
正文:列(子项:[
灵活的(
弹性:3,
子项:使用者(构建器:(上下文、值、389;){
返回填充(
填充:所有边缘设置(15.0),
孩子:FittedBox(
子项:LinearPercenticator(
宽度:100.0,
fillColor:Colors.white,
linearGradient:linearGradient(
颜色:[颜色。红色,颜色。蓝色],
),
线宽:6.0,
百分比:value.progress/100,
中心:文本(
“${value.progress}%”,
样式:TextStyle(fontSize:5.0),
),
尾随:图标(
我的心情,
尺码:5,
),
linearStrokeCap:linearStrokeCap.roundAll,
背景颜色:颜色。灰色,
),
),
);
}
//容器(
//child:Text('downloading..${value.progress}'),
// ),
),
),
未来建设者(
生成器:(BuildContext上下文,异步快照){
回程灵活(
弹性:9,
子:容器(
子:文件==null
?文本(“搜索文件”)
:ListView.builder(
//如果抓取了文件/文件夹列表,则在此处显示
itemCount:文件?长度为0,
itemBuilder:(上下文,索引){
回程卡(
孩子:ListTile(
标题:文本(文件[索引].path.split(“/”).last),
前导:图标(图标、视频标签),
尾随:图标(
图标。删除,
颜色:Colors.redAccent,
),
));
},
),
),
);
},
),
]));
}
}
这是UI的外观:


我知道您正在使用FutureBuilder,如果我正确理解了这个问题,它可能是正确的解决方案,它会侦听流中的更改,并在每次更改时重建子窗口小部件