如何在操作后部署/重新创建窗口小部件

时间:2017-09-19 03:58:36

标签: flutter

我试图找出如何基于某个动作销毁/重新创建Widget(例如:onPressed)。

我想到的方法是让我的Widget在Opacity对象中敲击,并根据我应用中某处的用户交互来控制Opacity对象的状态(即:hide /显示小部件而不是dispose / recreate)。但是,我在这里问的是,如何在单击按钮后销毁/重新创建一个Widget?

我创建了以下虚拟示例以显示我的意思。

当我按下云Icon时应该处理红色Icon,并在按下RaisedButton时重新创建。

enter image description here

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

2 个答案:

答案 0 :(得分:7)

如果您希望在初始化和处置时收到通知,则必须在StatefulWidget中包装红色图标。 StatelessWidget没有这些回调。

您可以在StatefulWidget中将setState替换为null,并将处理其State。您可以在第二个setState回调中将其设置恢复正​​常,并创建新的State并调用其initState

如果您想要disposeinitState而不经过将小部件替换为null的中间步骤,请尝试为StatefulWidget新{{1}当按下重新创建按钮时。这样可以防止Flutter将旧的UniqueKey与新的State相关联。

似乎你主要是出于好奇而不是真正的用例而这样做。您所描述的购物卡示例可能根本不需要使用StatefulWidgetinitState,您只需使用dispose

答案 1 :(得分:-2)

只是想添加此答案以解决类似类型的问题。

如果您要构建,请在使用Navigator时销毁对话框或其他登录/弹出方案:

关闭Navigator路线以返回到原始的Widget屏幕,然​​后您可以Navigator.push回到“重新创建” Widget的地方:

void _close() {
  Navigator.pop(context);
}

From Flutter:

诸如对话框或弹出菜单之类的路由通常使用此机制来 将用户选择的值返回给创建他们的小部件的小部件 路线。