【问题标题】:Make a column in a ListView/SingleChildScrollView take up the REMAINING space of a screen使 ListView/SingleChildScrollView 中的列占用屏幕的剩余空间
【发布时间】:2020-10-11 02:53:27
【问题描述】:

我正在尝试构建一个注册屏幕,我在 adobe XD 上设计的概念是注册屏幕将在顶部中心有应用程序徽标,一张带有大约 3-4 个文本字段/区域的卡片,一个按钮底部中心。由于要填写多张卡片,我希望在中心有一个圆形页面指示器,以便用户更轻松地跟踪要填写的剩余数据,并且用户不必在单个屏幕上填写非常长的列表。

我试过的是 一个 SingleChildScrollView,其中有一列,该列具有要填写的第一个注册表单,其中的另一列具有带有页面指示器的按钮

Stack 和 pageviewbuilder 这在布局方面给了我最好的结果,但唯一的问题是,当使用键盘时,小部件会引发 renderFlew 溢出

现在是一个包含表单的列表视图和一个包含按钮和页面指示器的列

我需要的东西:

  • 键盘不会导致表单出现问题
  • 适用于多种屏幕尺寸的实用且一致的代码

我的最新代码

@override
  Widget build(BuildContext context) {
    List<Widget> registrationForms = [EmailRegistrationForm()];
    return Scaffold(
        backgroundColor: Theme.of(context).backgroundColor,
        body: ListView(
          children: <Widget>[
            Align(alignment: Alignment.center, child: registrationForms[0]),
            Container(
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.only(top: 5),
                    child: InkWell(
                      child: Text("Already have an account? Login!"),
                    ),
                  ),
                  PrimaryStyledButton(text: "Next", onPress: () {}),
                  CirclePageIndicator(
                    currentPageNotifier: _currentPageNotifier,
                    itemCount: registrationForms.length,
                    selectedDotColor: Theme.of(context).accentColor,
                  )
                ],
              ),
            ),

          ],
        ));
  }

预期结果

【问题讨论】:

  • 并没有真正改变任何东西,并且展开后不能将列包装在列表视图中,如果展开与列和单子滚动视图一起使用,则会引发此错误 RenderFlex 子级具有非零弹性但传入高度限制是无限的。
  • 尝试用 Flexible with fit:FlexFit.loose 包裹它
  • 没有工作与展开时遇到的问题相同,因此我最终从列表视图中删除了该列,我将发布我的解决方案作为答案
  • 在列内更改代码本身的结构时扩展/灵活的工作

标签: flutter dart flutter-layout


【解决方案1】:

所以这最终对我有用,我意识到列表视图有点没用,所以结构如下: SingleChildScrollView 有一个大小的框(屏幕大小)和一个大小框内的列,SingleChildScrollView 是为了阻止键盘向上推东西的问题,同时提供在填充数据时滚动的能力

return Scaffold(
        backgroundColor: Theme.of(context).backgroundColor,
        body: SingleChildScrollView(
          child: SizedBox(
            height: MediaQuery.of(context).size.height,
            width: MediaQuery.of(context).size.width,
            child: Column(
              children: <Widget>[
                Padding(
                  padding: EdgeInsets.only(bottom: 10),
                  child: landingScreen.getLogoWidget(),
                ),
                Expanded(
                  child: Align(
                      alignment: Alignment.center, child: registrationForms[0]),
                ),
                Padding(
                  padding: EdgeInsets.only(bottom: 10),
                  child: Column(
                    mainAxisSize: MainAxisSize.max,
                    children: <Widget>[
                      Padding(
                        padding: EdgeInsets.only(top: 5),
                        child: InkWell(
                          child: Text(ALREADY_REGISTERED_MSG),
                        ),
                      ),
                      PrimaryStyledButton(text: NEXT, onPress: () {
                      }, ),
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 8.0),
                        child: CirclePageIndicator(
                          currentPageNotifier: _currentPageNotifier,
                          itemCount: registrationForms.length,
                          selectedDotColor: Theme.of(context).accentColor,
                        ),
                      )
                    ],
                  ),
                ),
              ],
            ),
          ),
        ));

【讨论】:

    【解决方案2】:

    尝试将 SingleChildScrollView 与展开的小部件一起使用

      @override
      Widget build(BuildContext context) {
        List<Widget> registrationForms = [EmailRegistrationForm()];
        return Scaffold(
          backgroundColor: Theme.of(context).backgroundColor,
          body: SingleChildScrollView(
            child: Expanded(
              child: Column(
                children: <Widget>[
                  Align(alignment: Alignment.center, child: registrationForms[0]),
                  Container(
                    child: Column(
                      children: <Widget>[
                        Padding(
                          padding: EdgeInsets.only(top: 5),
                          child: InkWell(
                            child: Text("Already have an account? Login!"),
                          ),
                        ),
                        PrimaryStyledButton(text: "Next", onPress: () {}),
                        CirclePageIndicator(
                          currentPageNotifier: _currentPageNotifier,
                          itemCount: registrationForms.length,
                          selectedDotColor: Theme.of(context).accentColor,
                        )
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
        );
      }
    

    【讨论】:

    • 使用灵活小部件而不是展开小部件。除了你得到你想要的效果对吗?
    • 没有工作与展开时遇到的问题相同,因此我最终从列表视图中删除了该列,我将发布我的解决方案作为答案
    • 在列内更改代码本身的结构时扩展/灵活的工作
    猜你喜欢
    • 2020-08-26
    • 2011-08-13
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2019-10-08
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多