Flutter中SetState未更新参数值,无法切换网格/列表视图如何解决?
Flutter网格/列表视图切换状态不更新问题解决
问题根因
你在_setPostToggle方法中写反了赋值逻辑,当前代码是将传入的参数toggleType覆盖为状态变量postViewStyle的值,完全没有修改状态变量,所以不管点击哪个按钮,状态都不会更新,setState自然不会触发视图刷新,控制台也永远打印gridView。
解决方案
修改_setPostToggle方法的赋值顺序,将状态变量postViewStyle更新为传入的参数值:
_setPostToggle(String toggleType) { setState(() { // 修正赋值顺序:把状态值改为传入的切换类型 postViewStyle = toggleType; }); }
额外注意事项
你当前列表视图的实现存在语法隐患:Column的children要求是Widget类型,你直接传入List<Post>类型的posts会报错,需要和网格视图一样,把每个Post对象转为对应的列表项组件,示例如下:
} else if (postViewStyle == "listView") { return Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, // 把Post转为对应的列表渲染组件 children: posts.map((post) => PostListTile(post: post)).toList(), ); }
可选优化
可以给选中的视图切换按钮加高亮状态,提升交互体验:
buildToogleView() { return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ IconButton( onPressed: () { _setPostToggle("gridView"); print(postViewStyle); }, icon: Icon( Icons.grid_view_rounded, size: 25, ), // 当前是网格视图时高亮,否则用灰色 color: postViewStyle == 'gridView' ? Colors.deepPurple.shade500 : Colors.grey, ), IconButton( onPressed: () { _setPostToggle("listView"); print(postViewStyle); }, icon: Icon( Icons.photo_size_select_actual_outlined, size: 25, ), // 当前是列表视图时高亮,否则用灰色 color: postViewStyle == 'listView' ? Colors.deepPurple.shade500 : Colors.grey, ) ], ); }
内容的提问来源于stack exchange,提问作者Lokendra Bohara
相关产品推荐
相关产品推荐

