Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 为什么在flatter中从回调返回后会更新另一个map实例?_Flutter_Dart - Fatal编程技术网

Flutter 为什么在flatter中从回调返回后会更新另一个map实例?

Flutter 为什么在flatter中从回调返回后会更新另一个map实例?,flutter,dart,Flutter,Dart,为什么每次调用DayofWeekInkWellButn后都会在此处创建一个新的days实例?如果我将天更改为静态,则可以工作,但这不是我想要的,因为它将为ChoseDayRowWidget的每个实例只创建一个副本?有人能给我解释一下为什么会这样,我能做些什么来解决这个问题 class ChoseDayRowWidget extends StatefulWidget { var days = { 'Sunday': true, 'Monday': true, 'Tues

为什么每次调用DayofWeekInkWellButn后都会在此处创建一个新的days实例?如果我将天更改为静态,则可以工作,但这不是我想要的,因为它将为ChoseDayRowWidget的每个实例只创建一个副本?有人能给我解释一下为什么会这样,我能做些什么来解决这个问题

class ChoseDayRowWidget extends StatefulWidget {
  var days = {
    'Sunday': true,
    'Monday': true,
    'Tuesday': true,
    'Wednesday': true,
    'Thursday': true,
    'Friday': true,
    'Saturday': true
  };

  final DaysCallback callback;

  ChoseDayRowWidget({this.callback});

  @override
  _ChoseDayRowWidgetState createState() => _ChoseDayRowWidgetState();
}

class _ChoseDayRowWidgetState extends State<ChoseDayRowWidget> {
  @override
  Widget build(BuildContext context) {
    SizeConfig().init(context);
    return Container(
        margin: EdgeInsets.symmetric(
            horizontal: SizeConfig.blockSizeHorizontal * 7,
            vertical: SizeConfig.blockSizeVertical * 3),
        child: DecoratedBox(
            decoration: BoxDecoration(
              border:
              Border(bottom: BorderSide(color: Colors.black12, width: 1.3)),
            ),
            child: Column(children: <Widget>[
              Align(
                alignment: Alignment.centerLeft,
                child: Text(Constants.GENERAL_CHOOSE_DAY_WIDGET_MESSAGE,
                    style: TextStyle(
                        fontSize: SizeConfig.safeBlockVertical * 3.5,
                        fontWeight: FontWeight.w500,
                        color: CommonColorPallete.widgetTitleColor)),
              ),
              SizedBox(
                height: SizeConfig.blockSizeVertical * 2,
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  DayofWeekInkWellButn('S',widget.days['Sunday'],
                      callback: (val) => saveDays(val, 'Sunday')),
                  DayofWeekInkWellButn('M',widget.days['Monday'],
                      callback: (val) => saveDays(val, 'Monday')),
                  DayofWeekInkWellButn('T',widget.days['Tuesday'],
                      callback: (val) => saveDays(val, 'Tuesday')),
                  DayofWeekInkWellButn('W',widget.days['Wednesday'],
                      callback: (val) => saveDays(val, 'Wednesday')),
                  DayofWeekInkWellButn('T',widget.days['Thursday'],
                      callback: (val) => saveDays(val, 'Thursday')),
                  DayofWeekInkWellButn('F',widget.days['Friday'],
                      callback: (val) => saveDays(val, 'Friday')),
                  DayofWeekInkWellButn('S',widget.days['Saturday'],
                      callback: (val) => saveDays(val, 'Saturday')),
                ],
              ),
              SizedBox(
                height: SizeConfig.blockSizeVertical * 3,
              )
            ])));
  }

  void saveDays(val, day) {
    setState(() {
      widget.days[day] = val;
      //widget.callback(widget.days);
    });

  }
}



typedef void DaysCallback(val);

class DayofWeekInkWellButn extends StatefulWidget {
  String day;
  final DaysCallback callback;
  bool flag;

  DayofWeekInkWellButn(this.day, this.flag, {this.callback});

  @override
  _DayofWeekInkWellButnState createState() => _DayofWeekInkWellButnState();
}


class _DayofWeekInkWellButnState extends State<DayofWeekInkWellButn> {
  bool flag = true;
  Color setColor = Colors.white;
  Color onSelectedFillColor = CommonColorPallete.onSelectedFillColor;
  Color onDeselectFillColor = CommonColorPallete.chooseDayOnDeselectFillColor;
  Color boundaryColor = CommonColorPallete.chooseDayBoundaryColor;

  @override
  Widget build(BuildContext context) {

    SizeConfig().init(context);
    return InkWell(
      onTap: () {
        setState(() {
          if (flag == true) {
            setColor = onSelectedFillColor;
            boundaryColor = Colors.transparent;
          } else {
            boundaryColor = Colors.black;
            setColor = onDeselectFillColor;
          }
          flag = !flag;
          widget.callback(!flag);

        });
      },
      child: new Container(
        width: SizeConfig.blockSizeVertical * 5.5,
        height: SizeConfig.blockSizeVertical * 5.5,
        decoration: new BoxDecoration(
          color: setColor,
          border: new Border.all(color: boundaryColor, width: 1.0),
          borderRadius: new BorderRadius.circular(5.0),
        ),
        child: new Center(
          child: new Text(
            widget.day,
            style: new TextStyle(
                fontSize: SizeConfig.blockSizeVertical * 3.3,
                color: CommonColorPallete.fontColor,
                fontWeight: FontWeight.w300),
          ),
        ),
      ),
    );
  }
}


class chosedayrowidget扩展StatefulWidget{
var天数={
“星期天”:没错,
“星期一”:没错,
“星期二”:没错,
“星期三”:没错,
“星期四”:没错,
“星期五”:没错,
“星期六”:对
};
最终DaysCallback回调;
ChoseDayRowWidget({this.callback});
@凌驾
_ChoseDayRowWidgetState createState()=>ChoseDayRowWidgetState();
}
类(wWidgetState扩展状态){
@凌驾
小部件构建(构建上下文){
SizeConfig().init(上下文);
返回容器(
边距:边缘组。对称(
水平:SizeFig.BlockSize水平*7,
垂直尺寸:SizeFig.blockSizeVertical*3),
孩子:装饰盒(
装饰:盒子装饰(
边界:
边框(底部:边框边(颜色:Colors.black12,宽度:1.3)),
),
子项:列(子项:[
对齐(
对齐:alignment.centerLeft,
子项:文本(Constants.GENERAL\u CHOOSE\u DAY\u WIDGET\u消息,
样式:TextStyle(
fontSize:SizeConfig.safeBlockVertical*3.5,
fontWeight:fontWeight.w500,
颜色:CommonColorPallete.widgetTitleColor),
),
大小盒子(
高度:SizeFig.blockSizeVertical*2,
),
划船(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
DayofWeekInkWellButn('S',widget.days['Sunday'],
回调:(val)=>saveDays(val,‘Sunday’),
DayofWeekInkWellButn('M',widget.days['Monday'],
回调:(val)=>saveDays(val,“周一”),
DayofWeekInkWellButn('T',widget.days['周二],
回调:(val)=>saveDays(val,“星期二”),
DayofWeekInkWellButn('W',widget.days['周三],
回调:(val)=>saveDays(val,‘星期三’),
DayofWeekInkWellButn('T',widget.days['周四],
回调:(val)=>saveDays(val,‘星期四’),
DayofWeekInkWellButn('F',widget.days['Friday'],
回调:(val)=>saveDays(val,‘星期五’),
DayofWeekInkWellButn('S',widget.days['Saturday'],
回调:(val)=>saveDays(val,‘星期六’),
],
),
大小盒子(
高度:SizeFig.blockSizeVertical*3,
)
])));
}
作废保存日(val,日){
设置状态(){
widget.days[day]=val;
//widget.callback(widget.days);
});
}
}
typedef void DaysCallback(val);
类DayofWeekInkWellButn扩展StatefulWidget{
弦日;
最终DaysCallback回调;
布尔旗;
DayofWeekInkWellButn(this.day,this.flag,{this.callback});
@凌驾
_DayofWeekInkWellButnState createState()=>\u DayofWeekInkWellButnState();
}
类_DayofWeekInkWellButnState扩展状态{
布尔标志=真;
颜色设置颜色=Colors.white;
颜色onSelectedFillColor=CommonColorPallete.onSelectedFillColor;
颜色OnSelectFillColor=CommonColorPallete.choosedayonFillColor;
颜色边界颜色=CommonColorPallete.ChooseAdyBoundaryColor;
@凌驾
小部件构建(构建上下文){
SizeConfig().init(上下文);
回墨槽(
onTap:(){
设置状态(){
如果(标志==真){
setColor=onSelectedFillColor;
boundaryColor=Colors.transparent;
}否则{
boundaryColor=Colors.black;
setColor=onDeselectFillColor;
}
flag=!flag;
widget.callback(!flag);
});
},
子容器:新容器(
宽度:SizeFig.blockSizeVertical*5.5,
高度:SizeFig.blockSizeVertical*5.5,
装饰:新盒子装饰(
颜色:setColor,
边框:新边框。全部(颜色:boundaryColor,宽度:1.0),
边界半径:新边界半径。圆形(5.0),
),
孩子:新中心(
儿童:新文本(
今天,
样式:新文本样式(
fontSize:SizeConfig.blockSizeVertical*3.3,
颜色:CommonColorPallete.fontColor,
fontWeight:fontWeight.w300),
),
),
),
);
}
}

并非每次都创建新实例。问题是您的小部件是一个无状态小部件。这些类型的小部件不允许您改变它们的数据。如果你想改变var天的内容,你必须考虑创建一个StuteFultWIDGET。当您更改数据以便重建ui时,不要忘记调用setState

我尝试了您所说的,但只有WeekingWellbutn单击的最后一天的数据以天为单位保存,其余的被初始化值覆盖。您能用您的更改更新代码以便我们看到吗?给我们看看DayofWeekInkWellButn Too的代码我想逻辑有点错误。在切换标志之前运行回调,因此setState总是使用相同的值执行。现在切换两次。您正在切换var,并且在您切换var之后!