Flutter/Dart中向List追加记录时报String无法赋值给Iterable错误如何解决
问题原因
addAll()方法要求入参是可迭代集合(比如List、Set),但你代码里filesGB是单个字符串,直接调用allFiles.addAll(filesGB)就会报类型不匹配错误。- 你把列表累加逻辑写在了
ListView.separated的itemBuilder回调里,这个回调会在每个列表项渲染的时候都执行,会导致数据被重复追加,逻辑完全错位,累加操作应该放在文件选择成功后直接处理,不要放在列表渲染逻辑里。 - 你代码中
_paths?.addAll(allFiles!.map((e) ))写法不完整,且逻辑反向,你需要的是把新选的_paths里的路径加到累计的allFiles里,不是把旧的累计数据加到新选的列表里。
修复方案
第一步:调整文件选择后的累加逻辑
把累加逻辑移到_openDocumentFileExplorer方法中,文件选择成功后直接把新选的路径追加到allFiles里,提前定义好类成员变量List<String> allFiles = [];存储累计路径:
void _openDocumentFileExplorer({fileType: FileType.custom}) async { setState(() => _loadingPath = true); try{ _paths = (await FilePicker.platform.pickFiles( type: fileType, allowMultiple: true, allowedExtensions: ['pdf']))?.files; // 新增累加逻辑:选择成功后直接把新选的路径批量加到allFiles里 if(_paths != null && _paths!.isNotEmpty){ List<String> newSelectPaths = _paths!.map((e) => e.path.toString()).toList(); allFiles.addAll(newSelectPaths); } } on PlatformException catch (e) { print("Unsupported operation" + e.toString()); } catch (ex) { print('$ex'); } if (!mounted) return; setState(() { _loadingPath = false; _fileName = _paths != null ? _paths!.map((e) => e.name).toString() : '...'; }); }
第二步:修改ListView渲染逻辑
直接用累计的allFiles作为列表数据源,移除itemBuilder里的累加逻辑:
ListView.separated( itemCount: allFiles.isNotEmpty ? allFiles.length : 1, separatorBuilder: (context, index) => const Divider(height: 1), itemBuilder: (BuildContext context, int index) { if(allFiles.isEmpty){ return const Padding(padding: EdgeInsets.all(16), child: Text("暂无选中文件")); } final String fullPath = allFiles[index]; final String fileName = fullPath.split('/').last; // 这里返回你需要的列表项布局即可 return ListTile( title: Text(fileName), subtitle: Text(fullPath), ); }, )
额外注意点
如果需要避免重复添加同一个文件,可以在追加数据后加一行去重逻辑:allFiles = allFiles.toSet().toList();
内容的提问来源于stack exchange,提问作者Laurent Thomas
相关产品推荐
相关产品推荐

