在颤振的gridview中设置状态不更改值
基本上,我正在更新gridview中使用的列表值,当我单击gridview卡时,我正在更改该卡的颜色。当我打印颜色值时,它确实改变了,但在gridview中没有效果。请告诉我该怎么做?我的逻辑方法是错误的吗在颤振的gridview中设置状态不更改值,gridview,flutter,setstate,Gridview,Flutter,Setstate,基本上,我正在更新gridview中使用的列表值,当我单击gridview卡时,我正在更改该卡的颜色。当我打印颜色值时,它确实改变了,但在gridview中没有效果。请告诉我该怎么做?我的逻辑方法是错误的吗 class FilterDialog extends ModalRoute<void> { List<Grades> mGradeList = []; List<Styles> mStyleList = []; List<Type
class FilterDialog extends ModalRoute<void> {
List<Grades> mGradeList = [];
List<Styles> mStyleList = [];
List<Types> mTypeList = [];
List<Specials> mSpecialList = [];
FilterDialog(this.mGradeList, this.mStyleList, this.mTypeList, this.mSpecialList);
@override
Widget buildPage(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
// This makes sure that text and other content follows the material style
return Material(
type: MaterialType.transparency,
// make sure that the overlay content is not cut off
child: SafeArea(
child: _buildOverlayContent(context),
),
);
}
Widget _buildOverlayContent(BuildContext context) {
return new Container(
padding: EdgeInsets.only(left: 15, right: 15),
child: Column(
children: <Widget>[
titleWidget("Grade"),
gridViewWidget(mGradeList, 3, 2.2),
spaceWidget(),
titleWidget("Style"),
gridViewWidget(mStyleList, 2, 3.5),
spaceWidget(),
titleWidget("Type"),
gridViewWidget(mTypeList, 2, 3.5),
spaceWidget(),
titleWidget("Special"),
gridViewWidget(mSpecialList, 2, 3.5),
],
)
);
}
Widget gridViewWidget(list, int count, double ratio) {
return GridView.count(
shrinkWrap: true,
crossAxisCount: count,
mainAxisSpacing: 2.0,
crossAxisSpacing: 1.0,
childAspectRatio: ratio,
physics: new NeverScrollableScrollPhysics(),
children: _getTiles(list)
);
}
void _onTileClicked(int index, value, list){
assert(index != null);
assert(value != null);
setState(() {
list[index].setSelected(!value);
});
debugPrint("You tapped on item $index with $value");
}
// Get grid tiles
List<Widget> _getTiles(list) {
final List<Widget> tiles = <Widget>[];
for (int i = 0; i < list.length; i++) {
tiles.add(new GridTile(
child: new Center(
child: Container(
height: 35.0,
child: new RaisedButton(
onPressed: () => _onTileClicked(i, list[i]["selected"], list),
color: list[i]["selected"] ? backgroundColor : white, //here value not changing
shape: new RoundedRectangleBorder(
borderRadius:
new BorderRadius.circular(30.0)),
child: new Text(
list[i]["label"],
textAlign: TextAlign.center,
style: new TextStyle(
fontSize: 14.0,
color: Colors.grey,
),
),
),
),
),
));
}
return tiles;
}
一些数据:
var typeList = [{"label": "Crack", "selected": false}, {"label": "Face", "selected": false},
{"label": "Slab", "selected": false}, {"label": "Multi-pitch", "selected": false} ];
Widget\u buildoverlycontent(BuildContext){
gridViewWidget(mTypeList,2,3.5)
列表_getTiles(列表){
按下按钮:()=>\u按下按钮(i,列出[i][“选定的”],列出),
最终类型列表=[{“标签”:“裂纹”,“选定的”:假},{“标签”:“面”,“选定的”:假},
{“label”:“Slab”,“selected”:false},{“label”:“Multi-pitch”,“selected”:false}
您是否打算将typeList用作全局状态?
我认为这个变量不应该有最后一个修饰符
如果您从未打算更改变量,请使用final或const
代替var或添加到类型。可以设置最终变量
只有一次;常量变量是编译时常量。(常量
变量是隐式的final。)最终的顶级或类变量
在第一次使用时初始化
我的回答基于这样一个事实:当您将等级定义为对象时,您将列表[I][“selected”]
作为地图访问。小部件\u BuildOverlyContent(BuildContext上下文){
gridViewWidget(mTypeList,2,3.5)
列表_getTiles(列表){
按下按钮:()=>\u按下按钮(i,列出[i][“选定的”],列出),
最终类型列表=[{“标签”:“裂纹”,“选定的”:假},{“标签”:“面”,“选定的”:假},
{“label”:“Slab”,“selected”:false},{“label”:“Multi-pitch”,“selected”:false}
您是否打算将typeList用作全局状态?
我认为这个变量不应该有最后一个修饰符
如果您从未打算更改变量,请使用final或const
代替var或添加到类型。可以设置最终变量
只有一次;常量变量是编译时常量。(常量
变量是隐式的final。)最终的顶级或类变量
在第一次使用时初始化
我的回答基于这样一个事实:当你将等级定义为一个对象时,你将列表[I][“selected”]
作为一个地图访问。你的类必须扩展StatefulWidget以及它的状态小部件,以便你使用设置状态()方法。例如:
class FilterWidget extends StatefulWidget {
@override
_FilterWidgetState createState() => _FilterWidgetState();
}
class _FilterWidgetState extends State<FilterWidget> {
//lists here
@override
Widget build(BuildContext context) {
//build stuff here with setState() being used
}
}
class FilterWidget扩展StatefulWidget{
@凌驾
_FilterWidgetState createState()=>\u FilterWidgetState();
}
类_FilterWidgetState扩展状态{
//这里列出
@凌驾
小部件构建(构建上下文){
//使用setState()在此处构建内容
}
}
您的类必须扩展StatefulWidget以及State小部件,以便使用setState()方法。例如:
class FilterWidget extends StatefulWidget {
@override
_FilterWidgetState createState() => _FilterWidgetState();
}
class _FilterWidgetState extends State<FilterWidget> {
//lists here
@override
Widget build(BuildContext context) {
//build stuff here with setState() being used
}
}
class FilterWidget扩展StatefulWidget{
@凌驾
_FilterWidgetState createState()=>\u FilterWidgetState();
}
类_FilterWidgetState扩展状态{
//这里列出
@凌驾
小部件构建(构建上下文){
//使用setState()在此处构建内容
}
}
我遇到了同样的问题。我的解决方案是在GridView中重建要更改的对象。不要更新列表中的项目,而是重建列表,并根据需要更新项目。也许可以
我想,如果列表点没有更改,包含它的GridView将不会更改。我遇到了同样的问题。我的解决方案是在GridView中重建要更改的对象。不要更新列表中的项目,而是重建列表,并根据需要更新项目。也许可以
我想如果列表点没有改变,包含它的GridView也不会改变。谢谢。我会记住。但这对我的问题没有帮助。答案可能是两个选择。我猜是错误的选择。另一个问题是有状态小部件。哦,好吧。50/50机会谢谢。我会记住。但这不是帮助回答我的问题。答案可能是两个选择。我猜是错误的选择。另一个问题是有状态的小部件。哦,好吧。50/50 chancesetState工作正常。我不能使用StatefulWidget,因为它的对话框模式类,我每次都会得到更新值,它只是对GridView没有影响。setState中的逻辑会改变nge值,但setState的要点是to。由于您的小部件不是有状态的或扩展状态,那么setState()方法将不起作用。我可以问一下为什么要扩展ModalRoute类吗?因为filterview应该在transperent dialog中。这就是我使用ModalRoute类的原因。是否有其他方法使用statfulwidget创建transperent dialog。您可以使用Colors.black.withOpacity(0.8)(使用您想要的任何值)或Colors.transparent用于脚手架或材质小部件的颜色道具,以获得透明/玻璃般的效果。也许可以尝试一下?它与StatefulWidget一起工作,但与ModalRoute不一起工作。感谢您打开我的眼睛。现在唯一剩下的问题是使页面透明。我想没有ModalRoute是不可能的。setState工作正常。。我不能使用StatefulWidget,因为它的对话框模式类,并且我每次都会得到更新的值,它对GridView没有任何影响setState中的逻辑将更改值,但setState的要点是。因为你的小部件没有状态或扩展状态,所以setState()方法将不起作用。我可以问一下为什么要扩展ModalRoute类吗?因为filterview应该在transperent dialog中。这就是我使用ModalRoute类的原因。是否有其他方法使用statfulwidget创建transperent dialog。您可以使用Colors.black.withOpacity(0.8)(使用您想要的任何值)或者颜色。对于脚手架或材质小部件的颜色道具来说是透明的,以获得透明/玻璃般的效果。也许可以这样做
class FilterWidget extends StatefulWidget {
@override
_FilterWidgetState createState() => _FilterWidgetState();
}
class _FilterWidgetState extends State<FilterWidget> {
//lists here
@override
Widget build(BuildContext context) {
//build stuff here with setState() being used
}
}