flutter - Flutter 不支持的操作:在复合列表布局上添加
问题描述
我想要一个由FilterChip 和(垂直)ListView 组成的屏幕。FilterChip 列表必须由页面上的主列表(第二个小部件)的对象属性组成。这是我的代码:
class _ListFilmResultsWidgetState extends State<ListFilmResultsWidget> {
Wrap filters = Wrap(direction: Axis.horizontal);
@override
Widget build(BuildContext context) {
return FutureBuilder(
builder: (context, projectSnap) {
switch(projectSnap.connectionState) {
case ConnectionState.waiting:
return const Center(child: CircularProgressIndicator());
case ConnectionState.done:
if(projectSnap.hasData){
List<Film>? listFilms = projectSnap.data as List<Film>?;
return
ListView(children: [
filters,
ListView.builder(
itemCount: listFilms!.length,
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemBuilder: (context, index) {
Film item = listFilms[index];
addFilters(item.genres);
return Card(
child: Center(
child: ListTile(
title: Text('${item.title} (${item.releaseYear})'),
subtitle: Text(item.plot!),
),
)
);
}
)
]);
}
}
return Container();
},
future: _getFilmsDetails(context)
);
}
void addFilters(List<Genre> genres){
for(int i=0; i<genres.length; i++){
setState(() {
filters.children.add(FilterChip
(label: Text(genres[i].name),
key: Key("${genres[i].id}"),
onSelected: (value) => {},
selected: true));
});
}
}
因此,正如您所看到的,当我获得一个项目( Film item = listFilms[index]; )时,我调用方法 addFilters 以从中获取流派列表并将她添加到过滤器(FilterChip 的包装)。问题是我收到错误“不支持的操作:添加”,我猜这是因为放置包装和列表的 ListView 是无状态小部件。我怎么能解决这个问题?有什么方法可以将项目添加到 Wrap 中吗?
解决方案
Flutter 中的 Widget 是不可变的,这意味着一旦创建了 Widget,就无法修改其参数。
您可以创建一个包含列表FilterChip
或其他数据的变量,然后在方法中创建Wrap
小部件。build
例如:
class _DemoState extends State<Demo> {
final labels = ['A', 'B', 'C'];
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Wrap(
children: [
for (final label in labels)
FilterChip(
label: Text(label),
onSelected: (_) {
// Add a new `FilterChip` once clicked
setState(() => labels.add('D'));
},
),
],
),
),
);
}
}
推荐阅读
- selenium - 使用 selenium python 在 youtube 文本字段中输入自定义文本
- reactjs - 如何在父组件中更改道具后更新子组件
- excel - 使用 3 个表的多个复杂 IF 条件
- python-3.x - dicttoxml 抛出 AttributeError
- javascript - 如何显示合并排序的过程,类似于我对画布上的冒泡排序所做的操作
- r - 如何更改“pairs”函数生成的散点图对角线上的文本?
- c++ - lua 5.3.5 + luasocket 3.0-rc1 + luasec 0.8:带有多个 luaopen_xxx_xxx 导出函数名的 WIN32 DLL
- python - 如何在 Beautiful Soup 中深入多个级别(find_all 错误)
- c++ - IO 可以使用可变的吗?
- ios - navigationBarItems 中的 SwiftUI NavigationButton