【问题标题】:Tab is shifting when widget is not visible当小部件不可见时选项卡正在移动
【发布时间】:2020-07-20 10:13:25
【问题描述】:

我是 Flutter 的新手,所以也许我的问题对某人来说是基本的。

问题是在我的应用程序中,当 CheckBox 未选中时,我想隐藏 TextField。 TextField 旁边是一个应该是静态的按钮。我的问题是,当我想隐藏这个 TextField 时,按钮会移到左侧。我认为最好的选择是给你看

之前:

之后:

这是我正在使用的代码:

bool secondLayer = false;

void _secondLayer(bool value) => setState(() => secondLayer = value);
@override
  Widget build(BuildContext context) {
    return new Scaffold(
      /*appBar: new AppBar(
        title: new Text('Name Here'),
      ),*/
        resizeToAvoidBottomInset: false,
        body: SingleChildScrollView(
            child: new Container(
            padding: new EdgeInsets.all(32.0),
            child: new Center(
              child: new Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Container(
                    child: new Row(
                      children: <Widget>[
                        Expanded(
                          child: Column(
                            children: <Widget>[
                              new TextField(
                                decoration: InputDecoration(
                                  labelText: 'First Hidden Layer',
                                  hintText: '25',
                                ),
                                autocorrect: true,
                                autofocus: true,
                                keyboardType: TextInputType.number,
                              ),
                            ],
                          ),
                        ),
                        Expanded(
                          child: Column(
                            children: <Widget>[
                              new SizedBox(
                                  width: 100,
                                  child: new RaisedButton(onPressed: null, child: new Text('ADD DATA'),)
                              )
                            ],
                          ),
                        )
                      ],
                    ),
                  ),
                  Container(
                    child: new CheckboxListTile(
                        value: secondLayer,
                        onChanged: _secondLayer,

                        title: new Text(
                            'Use Second Hidden Layer',
                            style: new TextStyle(
                              fontSize: 12
                            ),
                        ),
                        controlAffinity: ListTileControlAffinity.leading,
                    ),

                  ),
                  Container(
                    child: new Row(
                      children: <Widget>[
                        Visibility(
                          visible: secondLayer,
                          child: new Expanded(
                            child: Column(
                              children: <Widget>[
                                new TextField(
                                  decoration: InputDecoration(
                                    labelText: 'Second Hidden Layer',
                                    hintText: '25',
                                  ),
                                  autocorrect: true,
                                  autofocus: true,
                                  keyboardType: TextInputType.number,
                                ),
                              ],
                            ),
                          ),
                        ),
                        Expanded(
                          child: Column(
                            children: <Widget>[
                              new SizedBox(
                                width: 100,
                                child: new RaisedButton(onPressed: null, child: new Text('OPTIONS'),)
                              )

                            ],
                          ),
                        )
                      ],
                    ),
                  ),
                  Container(
                    child: new TextField(
                      decoration: InputDecoration(
                        labelText: 'Epochs',
                        hintText: '5000',
                      ),
                      autocorrect: true,
                      autofocus: true,
                      keyboardType: TextInputType.number,
                    ),
                  ),
                  Container(
                    child: new TextField(
                      decoration: InputDecoration(
                        labelText: 'Learning Rate',
                        hintText: '0.00333',
                      ),
                      autocorrect: true,
                      autofocus: true,
                      keyboardType: TextInputType.number,
                    ),
                  ),
                  Container(
                    padding: EdgeInsets.only(top: 20),
                    child: new Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: <Widget>[
                        Container(
                          width: MediaQuery.of(context).size.width/3,
                          height: MediaQuery.of(context).size.width,
                          decoration: BoxDecoration(
                            border: Border.all(color: Color.fromRGBO(0, 0, 0, 100)),
                          ),
                          child: new Text('data')
                        ),
                        Container(
                            width: MediaQuery.of(context).size.width/3,
                            height: MediaQuery.of(context).size.width,
                            decoration: BoxDecoration(
                              border: Border.all(color: Color.fromRGBO(0, 0, 0, 100)),
                            ),
                            child: new Text('data')
                        )
                      ],
                    )
                  )
                ],
              ),
            )
          )
        )
    );

【问题讨论】:

    标签: flutter widget show-hide shift


    【解决方案1】:

    这是因为您没有将任何replacement 属性添加到您的Visibility 小部件。

    Visibility(
       visible: secondLayer,
       child: Expanded(
          child: Column(
             children: <Widget>[
                // your text field here
             ]
          ),
       ),
       replacement: Expanded(child: Container()), // the widget which will fill the space when hiddden
    )
    

    当您将 TextField 替换为 Expanded 内的空 Container 以填充您的空白空间时,这样的方法应该可以工作。

    【讨论】:

      【解决方案2】:

      您需要将Visibility 小部件的maintainSize 属性设置为true,它用于决定“是否为小部件所在的位置保留空间”。 Source

      您还需要将maintainAnimationmaintainState 设置为true 才能使maintainSize 工作。 Source

      所以你的代码将来自:

      Visibility(
           visible: secondLayer,
           child: yourChildWidget
      ),
      

      到:

      Visibility(
         visible: secondLayer,
         maintainSize: true,
         maintainAnimation: true,
         maintainState: true,
         child: yourChildWidget
      ),
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-16
        • 1970-01-01
        • 2011-08-04
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多