我试图找出如何基于某个动作销毁/重新创建Widget
(例如:onPressed
)。
我想到的方法是让我的Widget在Opacity
对象中敲击,并根据我应用中某处的用户交互来控制Opacity
对象的状态(即:hide /显示小部件而不是dispose / recreate)。但是,我在这里问的是,如何在单击按钮后销毁/重新创建一个Widget?
我创建了以下虚拟示例以显示我的意思。
当我按下云Icon
时应该处理红色Icon
,并在按下RaisedButton
时重新创建。
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Destroy/Recreate Example"),
),
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Stack(fit: StackFit.passthrough,
children: <Widget>[
new IconButton(icon: new Icon(
Icons.cloud_circle, size: 40.0, color: Colors.blue,),
onPressed: null /*_destroyWidget*/),
new Positioned(child: new DecoratedBox(
decoration: new BoxDecoration(shape: BoxShape.circle),
child: new Icon(
Icons.add_circle, size: 20.0, color: Colors.red,),),
top: 3.0,
left: 3.0)
],
),
new RaisedButton(onPressed: null /*_recreateWidget*/,
child: new Text("Recreate!"),
),
])
)
);
}
如何开始这个想法?
更新
以下代码实现了相同的功能,但是通过操纵红色Opacity
的{{1}}(显示/隐藏)。
Icon
答案 0 :(得分:7)
如果您希望在初始化和处置时收到通知,则必须在StatefulWidget
中包装红色图标。 StatelessWidget
没有这些回调。
您可以在StatefulWidget
中将setState
替换为null,并将处理其State
。您可以在第二个setState
回调中将其设置恢复正常,并创建新的State
并调用其initState
。
如果您想要dispose
和initState
而不经过将小部件替换为null
的中间步骤,请尝试为StatefulWidget
新{{1}当按下重新创建按钮时。这样可以防止Flutter将旧的UniqueKey
与新的State
相关联。
似乎你主要是出于好奇而不是真正的用例而这样做。您所描述的购物卡示例可能根本不需要使用StatefulWidget
和initState
,您只需使用dispose
。
答案 1 :(得分:-2)
只是想添加此答案以解决类似类型的问题。
如果您要构建,请在使用Navigator
时销毁对话框或其他登录/弹出方案:
关闭Navigator
路线以返回到原始的Widget
屏幕,然后您可以Navigator.push
回到“重新创建” Widget
的地方:
void _close() {
Navigator.pop(context);
}
诸如对话框或弹出菜单之类的路由通常使用此机制来 将用户选择的值返回给创建他们的小部件的小部件 路线。