SingleChildScrollView带列,底部需要按钮

时间:2019-06-27 19:50:10

标签: flutter flutter-layout

我正在尝试创建一个带有一列的SingleChildScrollView,我希望按钮位于屏幕的最底部。为此,我尝试使用将SingleChildScrollView和FlatButton用作子代的堆栈。我最终得到的是这样:

enter image description here

即使我已将按钮定位并对准底部,我也无法将其固定在底部。绿色只是显示列的高度,按钮紧贴在列的底部。 Stack,SingleChildScrollView,Column和FlatButton仅占用显示它们所需的空间。我需要将该按钮粘贴到屏幕底部。

这是我用来创建它的代码。我想念什么?

return Scaffold(
  appBar: AppBar(
    // Here we take the value from the MyHomePage object that was created by
    // the App.build method, and use it to set our appbar title.
    title: Text(widget.title),
  ),
  body: Container(
    width: double.infinity,
    color: Colors.red,
    child: Stack(
      children: <Widget>[
        Container(
          color: Colors.green,
          child: SingleChildScrollView(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.end,
              children: <Widget>[
                Container(
                  child: TextField(
                    decoration: InputDecoration(
                      labelText: 'Protein',
                    ),
                  ),
                  margin: EdgeInsets.only(left: 20, right: 20),
                ),
                Container(
                  child: TextField(
                    decoration: InputDecoration(
                      labelText: 'Fat',
                    ),
                  ),
                  margin: EdgeInsets.only(left: 20, right: 20),
                ),
                Container(
                  child: TextField(
                    decoration: InputDecoration(
                      labelText: 'Fiber',
                    ),
                  ),
                  margin: EdgeInsets.only(left: 20, right: 20),
                ),
                Container(
                  child: TextField(
                    decoration: InputDecoration(
                      labelText: 'Moisture',
                    ),
                  ),
                  margin: EdgeInsets.only(left: 20, right: 20),
                ),
                Container(
                  child: TextField(
                    decoration: InputDecoration(
                      labelText: 'Ash',
                    ),
                  ),
                  margin: EdgeInsets.only(left: 20, right: 20),
                ),
              ],
            ),
          ),
        ),
        Positioned(
          bottom: 0,
          left: 0,
          right: 0,
          child: Align(
            alignment: Alignment.bottomCenter,
            child: ButtonTheme(
              minWidth: double.infinity,
              height: 50,
              child: FlatButton(
                color: Colors.blueAccent.shade400,
                onPressed: () {},
                child: Text(
                  'Calculate Carbs',
                  style: TextStyle(
                    fontSize: 20,
                    color: Colors.white,
                  ),
                ),
              ),
            ),
          ),
        )
      ],
    ),
  ),
);

编辑:下面给出的两种方法都可以用于扩展Stack以填充整个屏幕。我添加了其他TextField小部件来填充屏幕,然后单击底部的小部件以确保打开键盘时底部小部件可见,并注意到按钮覆盖了底部字段。就像滚动视图通过忽略那里的按钮来向上滚动正确的数量一样。

在下面的图像中,我点击了End Field 3小部件。该按钮将其覆盖,因此我看不到我正在输入的内容。

Keyboard Collapsed Keyboard Expanded

6 个答案:

答案 0 :(得分:1)

使用

height: double.infinity,

在您的父母Container


Container(
  width: double.infinity,
  height: double.infinity, // this is what you need
  color: Colors.red,
  child: Stack(...)
)

答案 1 :(得分:0)

将此参数添加到堆栈中:fit: StackFit.expand,

答案 2 :(得分:0)

带有浮动操作按钮的选项1

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Column(),
      ),
      floatingActionButton: YourButtonWidget(),
      floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
    );
  }

带有底部导航栏的选项2

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Column(),
      ),
      bottomNavigationBar: YourButtonWidget(),
    );
  }

答案 3 :(得分:0)

这种行为的原因是父容器的大小。只需更改容器大小<​​/ p>

      body: Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height,
        color: Colors.red,
        child: Stack(
          children: <Widget>[

您已经完成。

解释,如果您好奇的话:) 如果我们查看Stack小部件,我们可以找到此描述

   /// By default, the non-positioned children of the stack are aligned by their
  /// top left corners.

因此,此窗口小部件仅占用由父窗口小部件提供的空间。而您使用的容器没有尺寸。所有的子小部件都自动占据了它们的位置,而Alin在这个自动创建的容器中工作。

答案 4 :(得分:0)

使用CustomScrollView

CustomScrollView(
  slivers: [
    SliverFillRemaining(
      hasScrollBody: false,
      child: Column(
        children: <Widget>[
          const Text('Header'),
          Expanded(child: Container(color: Colors.red)),
          const Text('Footer'),
        ],
      ),
    ),
  ],
)

见:https://stackoverflow.com/a/62097942/5164462

答案 5 :(得分:-1)

始终将按钮保持在底部,

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Expanded(
              child: Padding(
                padding: const EdgeInsets.all(15.0),
                child: new Form(
                  key: _formKey, 
                  child: SingleChildScrollView(
                    child: Column(
                      children: [
                         _currntForm()
                      ],
                    )
                  )),
              )),
           Padding(
            padding: const EdgeInsets.all(15.0),
            child: FullWidthIconBotton(
              icon: Icon(LinearIcons.floppy_disk),
              label: 'SAVE',
              color: Colors.green,
              onClick: () {
                _validateFormFields();
              },
            ) ,
          ) 
        ],
      ),
    );
  }