Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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 为什么在具有另一个setState的子窗口小部件内的回调中调用setState会中断程序?_Flutter_Flutter Animation - Fatal编程技术网

Flutter 为什么在具有另一个setState的子窗口小部件内的回调中调用setState会中断程序?

Flutter 为什么在具有另一个setState的子窗口小部件内的回调中调用setState会中断程序?,flutter,flutter-animation,Flutter,Flutter Animation,这是我用动画实现的一个自定义开关小部件 枚举开关类型{ 锁定切换,启用切换 } 类DiamondSwitch扩展StatefulWidget{ 最终双倍宽度、高度; 最终开关类型开关类型; 最终双开关尺寸; 最后一次回收; 钻石开关({ 键,这个。宽度,这个。高度, this.switchType,this.switchThumbSize, @需要此.onTapCallback }):super(key:key); @凌驾 _DiamondSwitchState createState()=>

这是我用动画实现的一个自定义开关小部件


枚举开关类型{
锁定切换,启用切换
}
类DiamondSwitch扩展StatefulWidget{
最终双倍宽度、高度;
最终开关类型开关类型;
最终双开关尺寸;
最后一次回收;
钻石开关({
键,这个。宽度,这个。高度,
this.switchType,this.switchThumbSize,
@需要此.onTapCallback
}):super(key:key);
@凌驾
_DiamondSwitchState createState()=>\u DiamondSwitchState(
宽度:宽度,高度:高度,
switchType:switchType,switchThumbSize:switchThumbSize,
onTapCallback:onTapCallback
);
}
类_DiamondSwitchState扩展状态{
最终双倍宽度、高度;
最终积分_toggleAnimationDuration=1000;
bool _isOn=false;
最终名单
_暗半径阴影=[
Colors.black,Color.fromRGBO(10,10,10,1.0)
],
_lightGradientShades=[
颜色。白色,颜色。来自RGBO(1501501501.0)
];
最终开关类型开关类型;
最终双开关尺寸;
列表_switchIcons=新列表();
最终双开关电容=35.0;
最后一次回收;
_钻石态({
this.width=100.0,this.height=40.0,
this.switchThumbSize=40.0,@需要this.switchType,
@需要此.onTapCallback
});
@凌驾
void initState(){
_switchIcons.addAll(
(switchType==switchType.LockToggle)?
[
图标(
Icons.lock,
颜色:颜色,黑色,
尺寸:_switchIconSize,
),
图标(
Icons.lock\u打开,
颜色:颜色,白色,
尺寸:_switchIconSize,
)
]
:
[
图标(
完成了,
颜色:颜色,黑色,
尺寸:_switchIconSize,
),
图标(
图标。关闭,
颜色:颜色,白色,
尺寸:_switchIconSize,
)
]
);
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回动画容器(
持续时间:持续时间(毫秒:_toggleAnimationDuration),
宽度:宽度,高度:高度,
装饰:造型装饰(
形状:斜面矩形边框(
边界半径:边界半径。圆形(28.0),
一方:(_isOn)?
边界(
颜色:color.fromRGBO(45,45,45,1.0),
宽度:0.5,
)
:
没有,
),
梯度:线性梯度(
颜色:[
…((\u isOn)?\u深色渐变阴影:\u浅色渐变阴影)
],
开始:对齐(1.0,-0.8),结束:对齐(-0.7,1.0),
停止:[0.4,1.0]
),
),
对齐:对齐(0.0,0.0),
子:堆栈(
对齐:对齐(0.0,0.0),
儿童:[
动画定位(
持续时间:持续时间(毫秒:_toggleAnimationDuration),
曲线:Curves.easeIn,
左:(_-isOn)?0.0:((宽度*70)/100),
右:(_-isOn)?((宽度*70)/100):0.0,
儿童:手势检测器(
onTap:(){
onTapCallback();
设置状态(){
_伊森=!\u伊森;
});
},
孩子:动画切换器(
持续时间:持续时间(毫秒:_toggleAnimationDuration),
transitionBuilder:(小部件子项,动画){
返回衰减转换(
不透明度:动画,
孩子:孩子,
);
},
子对象:Transform.rotate(
对齐:对齐.center,
角度:(math.pi/4),
子:容器(
宽度:switchThumbSize,高度:switchThumbSize,
对齐:对齐.center,
装饰:盒子装饰(
边界半径:边界半径。圆形(3.0),
颜色:(_isOn)?颜色。白色:颜色。黑色,
边界:(_isOn)?
无效的
:
边界,全部(
颜色:color.fromRGBO(87,87,87,1.0),
宽度:1.0,
),
),
子对象:Transform.rotate(
对齐:对齐.center,
角度:-(数学pi/4),
孩子:(_isOn)?
_开关图标[0]
:
_开关图标[1],
),
),
),
),
),
)
],
),
);
}
}
我添加了一个onTapCallback,因为我需要在父窗口小部件中设置另一个标志来触发图像更改。下面是属于父窗口小部件的相关代码

钻石开关( switchType:switchType.LockToggle, 宽度:186.0, 身高:60.0, 开关尺寸:41.0, onTapCallback:(){ 此.setState(){ 这个。_isLockOn=!这个。_isLockOn; }); }, 键:UniqueKey(), ), 当我运行此代码时,动画不起作用。它检测tap并执行onTap回调,onTap中的所有代码都可以工作(我使用打印方法进行了测试),但正如我所说的,动画并没有发生

我想知道为什么会发生这种情况,这是关于颤振是如何工作的吗?如果是,你能解释一下吗

谢谢你花时间^。^


编辑

我想知道为什么使用setState获取一个方法会破坏我正在使用answerer@pulyaevskiy实现的方法共享当前父窗口小部件的动画

class\u设置状态扩展状态{
布尔
_isLockOn=false,
_isPassiconOn=false