为什么当构造函数参数更改时,StatefulWidget 的子状态不会被重置?
Why does a child state of StatefulWidget doesn't get reset when constructor parameter changes?
我有一个自定义小部件class:
class FancyButton extends StatefulWidget
{
final Function() onTap;
final String text;
final IconData icon;
bool enabled;
FancyButton({this.onTap, this.text, this.icon, this.enabled = true})
@override
_FancyButtonState createState()
{
return _FancyButtonState(onTap, text, icon, enabled);
}
}
class _FancyButtonState extends State<FancyButton> with SingleTickerProviderStateMixin
{
Function() onTap;
String text;
IconData icon;
bool enabled;
_FancyButtonState(this.onTap, this.text, this.icon, this.enabled);
@override
Widget build(BuildContext context) {
if(!enabled)
{
print("build disabled");
}
return GestureDetector(
onTap: onTap,
child: Container(
color: enabled ? Colors.red : Colors.green,
height: 20
),
);
}
}
我是这样使用的:
Widget continueButton = new StreamBuilder(
stream: viewModel.canFinishProfile.asBroadcastStream(),
initialData: viewModel.canFinishProfile.value,
builder: (builder, snapshot)
{
print("can finish profile " + viewModel.canFinishProfile.value.toString());
return FancyButton(
text: multilang.get("auth_continue"),
enabled: viewModel.canFinishProfile.value,
onTap: ()
{
viewModel.onClickedContinue.add(null);
},
);
},
)
所以我希望小部件在 canFinishProfile 值更改后进行更新。问题是一旦 canFinishProfile 值改变,FancyButton 的状态就不会更新,所以总是绘制一个旧的小部件视图。请注意,如果我将 FancyButton 更改为 StatelessWidget 并将其构建代码放入 StatelessWidget 中,那么它会重新绘制一次,然后 canFinishProfile 值会更改。但是,我需要它成为一个更复杂的功能的 StatefulWidget。
如果您使用 widget
属性,您 State
class 将能够监听 StatefulWidget
class 中的状态变化访问状态。
您需要更改:
enabled ? Colors.red : Colors.green
到
widget.enabled ? Colors.red : Colors.green
希望对您有所帮助。
我有一个自定义小部件class:
class FancyButton extends StatefulWidget
{
final Function() onTap;
final String text;
final IconData icon;
bool enabled;
FancyButton({this.onTap, this.text, this.icon, this.enabled = true})
@override
_FancyButtonState createState()
{
return _FancyButtonState(onTap, text, icon, enabled);
}
}
class _FancyButtonState extends State<FancyButton> with SingleTickerProviderStateMixin
{
Function() onTap;
String text;
IconData icon;
bool enabled;
_FancyButtonState(this.onTap, this.text, this.icon, this.enabled);
@override
Widget build(BuildContext context) {
if(!enabled)
{
print("build disabled");
}
return GestureDetector(
onTap: onTap,
child: Container(
color: enabled ? Colors.red : Colors.green,
height: 20
),
);
}
}
我是这样使用的:
Widget continueButton = new StreamBuilder(
stream: viewModel.canFinishProfile.asBroadcastStream(),
initialData: viewModel.canFinishProfile.value,
builder: (builder, snapshot)
{
print("can finish profile " + viewModel.canFinishProfile.value.toString());
return FancyButton(
text: multilang.get("auth_continue"),
enabled: viewModel.canFinishProfile.value,
onTap: ()
{
viewModel.onClickedContinue.add(null);
},
);
},
)
所以我希望小部件在 canFinishProfile 值更改后进行更新。问题是一旦 canFinishProfile 值改变,FancyButton 的状态就不会更新,所以总是绘制一个旧的小部件视图。请注意,如果我将 FancyButton 更改为 StatelessWidget 并将其构建代码放入 StatelessWidget 中,那么它会重新绘制一次,然后 canFinishProfile 值会更改。但是,我需要它成为一个更复杂的功能的 StatefulWidget。
如果您使用 widget
属性,您 State
class 将能够监听 StatefulWidget
class 中的状态变化访问状态。
您需要更改:
enabled ? Colors.red : Colors.green
到
widget.enabled ? Colors.red : Colors.green
希望对您有所帮助。