Android 颤振listview侦听文件目录中的更改并重新创建小部件
我正在建立一个下载管理器。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
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,如果我正确理解了这个问题,它可能是正确的解决方案,它会侦听流中的更改,并在每次更改时重建子窗口小部件