【发布时间】:2021-03-24 10:35:57
【问题描述】:
函数返回数据后,我的屏幕刷新仍然存在问题。
这是我的代码:
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body:
FutureBuilder<List<ArchiveFile>>(
future: _folderListFuture,
builder: (context, snapshot) {
print("!! Builder: ");
print("ctxt: "+context.toString());
print("snap: "+snapshot.toString());
if (snapshot.hasError)
return Text("ERROR ${snapshot.error}");
if (snapshot.connectionState == ConnectionState.waiting) {
// Otherwise, display a loading indicator.
return Center(child: CircularProgressIndicator());
}
else if (snapshot.connectionState == ConnectionState.done) {
access.disconnect();
if (snapshot.hasData)
return Center(
child: ListView(
children: [
for (var folder in snapshot.data)
ListTile(
title: Text(folder.filename),
subtitle: Text(folder.type== ArchiveFileType.FileType_Folder? "Folder" : "File"),
onTap: () => onTapped(folder),
trailing: folder.type== ArchiveFileType.FileType_Folder ? Icon(Icons.chevron_right_outlined) : null,
)
],
),
);
else return Text('No data');
}
else if (snapshot.connectionState == ConnectionState.none) {
// Otherwise, display a loading indicator.
return Center(child: CircularProgressIndicator());
}
else
return Text(snapshot.connectionState.toString());
}
)
_folderListFuture 定义为:
_folderListFuture = access.folderContent();
函数定义为:
Future<List<ArchiveFile>> folderContent() async {
print("[ftp] folderContent");
if (_connect==null)
return null;
//return Future( () async {
try {
final List<FTPEntry> ftplist = await _connect.listDirectoryContent();
// Creazione lista di Achievefiles
final List<ArchiveFile> fileList = <ArchiveFile>[];
ftplist.forEach((element) {
print("- "+element.toString());
ArchiveFile file = ArchiveFile(
element.name,
size: element.size,
type: element.type==FTPEntryType.FILE ? ArchiveFileType.FileType_File : ArchiveFileType.FileType_Folder,
);
fileList.add(file);
});
print("BB ");
_connect.disconnect().then( (ret){
print("[foldercontent] disconnected: "+ret.toString());
});
print("BB "+fileList.toString());
return fileList;
}
catch (e){
print("[folderContent] e: "+e.toString());
}
print("CC");
_connect.disconnect();
return null;
//});
}
调试窗口报告:
I/flutter (29031): Browse pressed
I/flutter (29031): !! Builder:
I/flutter (29031): ctxt: FutureBuilder<List<ArchiveFile>>(dirty, state: _FutureBuilderState<List<ArchiveFile>>#4179e)
I/flutter (29031): snap: AsyncSnapshot<List<ArchiveFile>>(ConnectionState.none, null, null, null)
I/flutter (29031): [ftp-connect] server: 192.168.1.173 - user: user - pass: password
I/flutter (29031): [ftp-connect] Start connection ..
I/flutter (29031): [ftp-connect] done!
I/flutter (29031): [pageFolderesList] connect true
I/flutter (29031): [ftp] folderContent
I/flutter (29031): - name=app_flutterprova.txt;modify=2021-03-24 08:53:13.000;perm=null;type=file;size=6;unique=null;unix.group=null;unix.mode=null;unix.owner=null;unix.uid=-1;unix.gid=-1
I/flutter (29031): - name=F1234;modify=2021-03-21 20:20:30.000;perm=null;type=dir;size=0;unique=null;unix.group=null;unix.mode=null;unix.owner=null;unix.uid=-1;unix.gid=-1
I/flutter (29031): - name=Immagine2.png;modify=2021-03-13 18:18:17.000;perm=null;type=file;size=15920;unique=null;unix.group=null;unix.mode=null;unix.owner=null;unix.uid=-1;unix.gid=-1
I/flutter (29031): - name=Immagine3.png;modify=2021-03-13 18:31:29.000;perm=null;type=file;size=29750;unique=null;unix.group=null;unix.mode=null;unix.owner=null;unix.uid=-1;unix.gid=-1
I/flutter (29031): - name=prova.txt;modify=2021-03-24 08:43:26.000;perm=null;type=file;size=0;unique=null;unix.group=null;unix.mode=null;unix.owner=null;unix.uid=-1;unix.gid=-1
I/flutter (29031): BB
I/flutter (29031): BB [Instance of 'ArchiveFile', Instance of 'ArchiveFile', Instance of 'ArchiveFile', Instance of 'ArchiveFile', Instance of 'ArchiveFile']
I/flutter (29031): [foldercontent] disconnected: true
FutureBuilder 第一次使用 ConnectionState.none 值触发。
然后通信开始并接收到数据。
当数据返回时,FutureBuilder 不会像我预期的那样被触发,并且 CircularProgressIndicator 出现在屏幕上。
如果我强制刷新屏幕,我会在屏幕上看到数据...
请问哪里出了问题?
【问题讨论】:
-
我不确定这一点,但您是否使用 set state 以便在收到数据时更改状态?
-
在哪里?在文件夹内容()函数中?它位于不同的类..
-
您正在检查数据是否存在的部分,因为您说即使在收到数据后它仍然显示循环进度指示器。您还说过,在显示热重载数据之后。尝试在 init State 中使用 bool 变量来检查是否接收到数据并保持设置状态
-
是否有可能因为第一次调用 FutureBuiler 时 _folderListFuture 变量为空,尚未初始化,所以没有触发页面刷新?
-
[已解决] 确认_folderListFuture 设置得太晚,FutureBuilder 看到值为null;然后在设置并完成变量时它无法触发。
标签: flutter dart flutter-futurebuilder