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