【问题标题】:Flutter - not able to fire FutureBuilder when I receive dataFlutter - 当我收到数据时无法触发 FutureBuilder
【发布时间】: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


【解决方案1】:

[已解决]

我可以确认 _folderListFuture 设置得太晚,FutureBuilder 将值视为 null;然后它什么也不做,并且在设置和完成变量时无法触发。

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2019-03-21
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2021-10-08
    • 2015-06-18
    • 2020-03-08
    相关资源
    最近更新 更多